//
// Functional interface to the Cephei Factories
//
namespace Cephei
  open System
  /// Functional interface to QL121 factories
  module Fun =
    begin

      //
      // prime FactoryFinder with reference to the process quantlib
      //
      let mutable Path = 
         let a = System.Reflection.Assembly.GetExecutingAssembly ()
         a.CodeBase.Substring(0, a.CodeBase.LastIndexOf('/'))

      do
         if System.IntPtr.Size = 4 then
           Cephei.Core.FactoryFinder.Reference (System.Reflection.Assembly.LoadFrom (Path + "/Cephei.QL121.impl.dll"))
         else
           Cephei.Core.FactoryFinder.Reference (System.Reflection.Assembly.LoadFrom (Path + "/Cephei.QL121.impl64.dll"))
    
      /// builder for doubles
      let Doubles = Cephei.Core.FactoryFinder.Find<Cephei.Core.IDouble_Factory> ()
      /// builder for ints
      let Ints = Cephei.Core.FactoryFinder.Find<Cephei.Core.IInt_Factory> () 
      /// builder for unsigned ints
      let UInts = Cephei.Core.FactoryFinder.Find<Cephei.Core.IUInt_Factory> ()
      /// builder for longs 
      let Longs = Cephei.Core.FactoryFinder.Find<Cephei.Core.ILong_Factory> ()
      /// builder for unsigned longs
      let ULongs = Cephei.Core.FactoryFinder.Find<Cephei.Core.IULong_Factory> ()
      /// builder for dates
      let DateTimes = Cephei.Core.FactoryFinder.Find<Cephei.Core.IDateTime_Factory> ()
      /// builder for booeans
      let Bools = Cephei.Core.FactoryFinder.Find<Cephei.Core.IBool_Factory> () 
      /// builder for string
      let Strings = Cephei.Core.FactoryFinder.Find<Cephei.Core.IString_Factory> ()
      /// builder for session objects
      let Sessions = Cephei.Core.FactoryFinder.Find<Cephei.QL.ISession_Factory > ()

      /// ! An American option can be exercised at any time between two predefined dates; the first date might be omitted, in which case the option can be exercised at any time before the expiry.  \todo check that everywhere the American condition is applied from earliestDate and not earlier
      let AmericanExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.IAmericanExercise_Factory > ()
      /// ! A Bermudan option can only be exercised at a set of fixed dates.
      let BermudanExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.IBermudanExercise_Factory > ()
      /// ! This class is purely virtual and acts as a base class for the actual cash flow implementations.
      let CashFlow = Cephei.Core.FactoryFinder.Find<Cephei.QL.ICashFlow_Factory > ()
      /// ! %Currency specification
      let Currency = Cephei.Core.FactoryFinder.Find<Cephei.QL.ICurrency_Factory > ()
      /// ! Discretized asset class used by numerical methods
      let DiscretizedAsset = Cephei.Core.FactoryFinder.Find<Cephei.QL.IDiscretizedAsset_Factory > ()
      /// ! Useful discretized discount bond asset
      let DiscretizedDiscountBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.IDiscretizedDiscountBond_Factory > ()
      /// ! \warning it is advised that derived classes take care of creating and initializing themselves an instance of the underlying.
      let DiscretizedOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.IDiscretizedOption_Factory > ()
      /// ! The payoff can be at exercise (the default) or at expiry
      let EarlyExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.IEarlyExercise_Factory > ()
      /// ! Base error class
      let Error = Cephei.Core.FactoryFinder.Find<Cephei.QL.IError_Factory > ()
      /// ! A European option can only be exercised at one (expiry) date.
      let EuropeanExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.IEuropeanExercise_Factory > ()
      /// ! This class acts as a base class for the actual event implementations.
      let Event = Cephei.Core.FactoryFinder.Find<Cephei.QL.IEvent_Factory > ()
      /// ! \test application of direct and derived exchange rate is tested against calculations.
      let ExchangeRate = Cephei.Core.FactoryFinder.Find<Cephei.QL.IExchangeRate_Factory > ()
      /// ! Base exercise class
      let Exercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.IExercise_Factory > ()
      /// ! additional %option results
      let Greeks = Cephei.Core.FactoryFinder.Find<Cephei.QL.IGreeks_Factory > ()
      /// ! \warning this class performs no check that the provided/requested fixings are for dates in the past, i.e. for dates less than or equal to the evaluation date. It is up to the client code to take care of possible inconsistencies due to "seeing in the future"
      let Index = Cephei.Core.FactoryFinder.Find<Cephei.QL.IIndex_Factory > ()
      /// ! This class is purely abstract and defines the interface of concrete instruments which will be derived from this one. \test observability of class instances is checked.
      let Instrument = Cephei.Core.FactoryFinder.Find<Cephei.QL.IInstrument_Factory > ()
      /// ASC091228 Moved from nested class
      let InstrumentResults = Cephei.Core.FactoryFinder.Find<Cephei.QL.IInstrumentResults_Factory > ()
      /// ! This class encapsulate the interest rate compounding algebra. It manages day-counting conventions, compounding conventions, conversion between different conventions, discount/compound factor calculations, and implied/equivalent rate calculations.  \test Converted rates are checked against known good results
      let InterestRate = Cephei.Core.FactoryFinder.Find<Cephei.QL.IInterestRate_Factory > ()
      /// ! interval price
      let IntervalPrice = Cephei.Core.FactoryFinder.Find<Cephei.QL.IIntervalPrice_Factory > ()
      /// ! %Lattice (tree, finite-differences) base class
      let Lattice = Cephei.Core.FactoryFinder.Find<Cephei.QL.ILattice_Factory > ()
      /// ! \test money arithmetic is tested with and without currency conversions.
      let Money = Cephei.Core.FactoryFinder.Find<Cephei.QL.IMoney_Factory > ()
      /// ! more additional %option results
      let MoreGreeks = Cephei.Core.FactoryFinder.Find<Cephei.QL.IMoreGreeks_Factory > ()
      /// ! base option class
      let Option = Cephei.Core.FactoryFinder.Find<Cephei.QL.IOption_Factory > ()
      /// ! Abstract base class for option payoffs
      let Payoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.IPayoff_Factory > ()
      /// 
      let Position = Cephei.Core.FactoryFinder.Find<Cephei.QL.IPosition_Factory > ()
      /// ! interface for pricing engines
      let PricingEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.IPricingEngine_Factory > ()
      /// 
      let PricingEngineArguments = Cephei.Core.FactoryFinder.Find<Cephei.QL.IPricingEngineArguments_Factory > ()
      /// 
      let PricingEngineResults = Cephei.Core.FactoryFinder.Find<Cephei.QL.IPricingEngineResults_Factory > ()
      /// ! information on a default-protection contract
      let Protection = Cephei.Core.FactoryFinder.Find<Cephei.QL.IProtection_Factory > ()
      /// ! \test the observability of class instances is tested.
      let Quote = Cephei.Core.FactoryFinder.Find<Cephei.QL.IQuote_Factory > ()
      /// helper class to temporarily and safely change the settings
      let SavedSettings = Cephei.Core.FactoryFinder.Find<Cephei.QL.ISavedSettings_Factory > ()
      /// ! This class describes a stochastic process governed by \f[ d\mathrm{x}_t = \mu(t, x_t)\mathrm{d}t + \sigma(t, \mathrm{x}_t) \cdot d\mathrm{W}_t. \f]
      let StochasticProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.IStochasticProcess_Factory > ()
      /// ! This class describes a stochastic process governed by \f[ dx_t = \mu(t, x_t)dt + \sigma(t, x_t)dW_t. \f]
      let StochasticProcess1D = Cephei.Core.FactoryFinder.Find<Cephei.QL.IStochasticProcess1D_Factory > ()
      /// ! Basic term-structure functionality
      let TermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.ITermStructure_Factory > ()
      /// ! \todo what was the rationale for limiting the grid to positive times? Investigate and see whether we can use it for negative ones as well.
      let TimeGrid = Cephei.Core.FactoryFinder.Find<Cephei.QL.ITimeGrid_Factory > ()
      /// 
      let VolatilityCompositor = Cephei.Core.FactoryFinder.Find<Cephei.QL.IVolatilityCompositor_Factory > ()

      module Cashflows =
        begin
          /// ! This class specializes SimpleCashFlow so that visitors can perform more detailed cash-flow analysis.
          let AmortizingPayment = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IAmortizingPayment_Factory > ()
          /// ! CMS-coupon pricer
          let AnalyticHaganPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IAnalyticHaganPricer_Factory > ()
          /// ! %Coupon paying a BMA index, where the coupon rate is a weighted average of relevant fixings.  The weighted average is computed based on the actual calendar days for which a given fixing is valid and contributing to the given interest period.  Before weights are computed, the fixing schedule is adjusted for the index's fixing day gap. See rate() method for details.
          let AverageBMACoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IAverageBMACoupon_Factory > ()
          /// ! helper class building a sequence of average BMA coupons
          let AverageBMALeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IAverageBMALeg_Factory > ()
          /// ! Bachelier-formula pricer for capped/floored yoy inflation coupons
          let BachelierYoYInflationCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IBachelierYoYInflationCouponPricer_Factory > ()
          /// ! Black-formula pricer for capped/floored Ibor coupons
          let BlackIborCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IBlackIborCouponPricer_Factory > ()
          /// 
          let BlackVanillaOptionPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IBlackVanillaOptionPricer_Factory > ()
          /// ! Black-formula pricer for capped/floored yoy inflation coupons
          let BlackYoYInflationCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IBlackYoYInflationCouponPricer_Factory > ()
          /// 
          let CappedFlooredCmsCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICappedFlooredCmsCoupon_Factory > ()
          /// ! The payoff \f$ P \f$ of a capped floating-rate coupon is: \f[ P = N \times T \times \min(a L + b, C). \f] The payoff of a floored floating-rate coupon is: \f[ P = N \times T \times \max(a L + b, F). \f] The payoff of a collared floating-rate coupon is: \f[ P = N \times T \times \min(\max(a L + b, F), C). \f]  where \f$ N \f$ is the notional, \f$ T \f$ is the accrual time, \f$ L \f$ is the floating rate, \f$ a \f$ is its gearing, \f$ b \f$ is the spread, and \f$ C \f$ and \f$ F \f$ the strikes.  They can be decomposed in the following manner. Decomposition of a capped floating rate coupon: \f[ R = \min(a L + b, C) = (a L + b) + \min(C - b - \xi |a| L, 0) \f] where \f$ \xi = sgn(a) \f$. Then: \f[ R = (a L + b) + |a| \min(\frac{C - b}{|a|} - \xi L, 0) \f]
          let CappedFlooredCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICappedFlooredCoupon_Factory > ()
          /// 
          let CappedFlooredIborCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICappedFlooredIborCoupon_Factory > ()
          /// ! Essentially a copy of the nominal version but taking a different index and a set of pricers (not just one).  The payoff \f$ P \f$ of a capped inflation-rate coupon with paysWithin = true is:  \f[ P = N \times T \times \min(a L + b, C). \f]  where \f$ N \f$ is the notional, \f$ T \f$ is the accrual time, \f$ L \f$ is the inflation rate, \f$ a \f$ is its gearing, \f$ b \f$ is the spread, and \f$ C \f$ and \f$ F \f$ the strikes.  The payoff of a floored inflation-rate coupon is:  \f[ P = N \times T \times \max(a L + b, F). \f]  The payoff of a collared inflation-rate coupon is:  \f[ P = N \times T \times \min(\max(a L + b, F), C). \f]  If paysWithin = false then the inverse is returned (this provides for instrument cap and caplet prices).  They can be decomposed in the following manner.  Decomposition of a capped floating rate coupon when paysWithin = true: \f[ R = \min(a L + b, C) = (a L + b) + \min(C - b - \xi |a| L, 0) \f] where \f$ \xi = sgn(a) \f$. Then: \f[ R = (a L + b) + |a| \min(\frac{C - b}{|a|} - \xi L, 0) \f]
          let CappedFlooredYoYInflationCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICappedFlooredYoYInflationCoupon_Factory > ()
          /// ! \todo add tests
          let CashFlows = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICashFlows_Factory > ()
          /// ! \warning This class does not perform any date adjustment, i.e., the start and end date passed upon construction should be already rolled to a business day.
          let CmsCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICmsCoupon_Factory > ()
          /// ! base pricer for vanilla CMS coupons
          let CmsCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICmsCouponPricer_Factory > ()
          /// ! helper class building a sequence of capped/floored cms-rate coupons
          let CmsLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICmsLeg_Factory > ()
          /// ! This class implements part of the CashFlow interface but it is still abstract and provides derived classes with methods for accrual period calculations.
          let Coupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICoupon_Factory > ()
          /// 
          let CPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICPI_Factory > ()
          /// ! It is NOT a coupon, i.e. no accruals.
          let CPICashFlow = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICPICashFlow_Factory > ()
          /// ! The performance is relative to the index value on the base date.  The other inflation value is taken from the refPeriodEnd date with observation lag, so any roll/calendar etc. will be built in by the caller.  By default this is done in the InflationCoupon which uses ModifiedPreceding with fixing days assumed positive meaning earlier, i.e. always stay in same month (relative to referencePeriodEnd).  This is more sophisticated than an %IndexedCashFlow because it does date calculations itself.  \todo we do not do any convexity adjustment for lags different to the natural ZCIIS lag that was used to create the forward inflation curve.
          let CPICoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICPICoupon_Factory > ()
          /// ! \note this pricer can already do swaplets but to get volatility-dependent coupons you need to implement the descendents.
          let CPICouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICPICouponPricer_Factory > ()
          /// ! Also allowing for the inflated notional at the end... especially if there is only one date in the schedule. If a fixedRate is zero you get a FixedRateCoupon, otherwise you get a ZeroInflationCoupon.  payoff is: spread + fixedRate x index
          let CPILeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ICPILeg_Factory > ()
          /// ! Cms-rate coupon with digital digital call/put option
          let DigitalCmsCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDigitalCmsCoupon_Factory > ()
          /// ! helper class building a sequence of digital ibor-rate coupons
          let DigitalCmsLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDigitalCmsLeg_Factory > ()
          /// ! \ingroup instruments  \test - the correctness of the returned value in case of Asset-or-nothing embedded option is tested by pricing the digital option with Cox-Rubinstein formula. - the correctness of the returned value in case of deep-in-the-money Asset-or-nothing embedded option is tested vs the expected values of coupon and option. - the correctness of the returned value in case of deep-out-of-the-money Asset-or-nothing embedded option is tested vs the expected values of coupon and option. - the correctness of the returned value in case of Cash-or-nothing embedded option is tested by pricing the digital option with Reiner-Rubinstein formula. - the correctness of the returned value in case of deep-in-the-money Cash-or-nothing embedded option is tested vs the expected values of coupon and option. - the correctness of the returned value in case of deep-out-of-the-money Cash-or-nothing embedded option is tested vs the expected values of coupon and option. - the correctness of the returned value is tested checking the correctness of the call-put parity relation. - the correctness of the returned value is tested by the relationship between prices in case of different replication types.
          let DigitalCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDigitalCoupon_Factory > ()
          /// ! Ibor rate coupon with digital digital call/put option
          let DigitalIborCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDigitalIborCoupon_Factory > ()
          /// ! helper class building a sequence of digital ibor-rate coupons
          let DigitalIborLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDigitalIborLeg_Factory > ()
          /// 
          let DigitalReplication = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDigitalReplication_Factory > ()
          /// ! This cash flow pays a predetermined amount at a given date.
          let Dividend = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDividend_Factory > ()
          /// ! %duration type
          let Duration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IDuration_Factory > ()
          /// ! This cash flow pays a predetermined amount at a given date.
          let FixedDividend = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IFixedDividend_Factory > ()
          /// ! %Coupon paying a fixed interest rate
          let FixedRateCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IFixedRateCoupon_Factory > ()
          /// ! helper class building a sequence of fixed rate coupons
          let FixedRateLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IFixedRateLeg_Factory > ()
          /// ! base floating-rate coupon class
          let FloatingRateCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IFloatingRateCoupon_Factory > ()
          /// ! generic pricer for floating-rate coupons
          let FloatingRateCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IFloatingRateCouponPricer_Factory > ()
          /// ! This cash flow pays a fractional amount at a given date.
          let FractionalDividend = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IFractionalDividend_Factory > ()
          /// 
          let GFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IGFunction_Factory > ()
          /// 
          let GFunctionFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IGFunctionFactory_Factory > ()
          /// ! Base class for the pricing of a CMS coupon via static replication as in Hagan's "Conundrums..." article
          let HaganPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IHaganPricer_Factory > ()
          /// ! %Coupon paying a Libor-type index
          let IborCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IIborCoupon_Factory > ()
          /// ! base pricer for capped/floored Ibor coupons
          let IborCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IIborCouponPricer_Factory > ()
          /// ! helper class building a sequence of capped/floored ibor-rate coupons
          let IborLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IIborLeg_Factory > ()
          /// ! This cash flow is not a coupon, i.e., there's no accrual.  The amount is either i(T)/i(0) or i(T)/i(0) - 1, depending on the growthOnly parameter.  We expect this to be used inside an instrument that does all the date adjustment etc., so this takes just dates and does not change them. growthOnly = false means i(T)/i(0), which is a bond-type setting. growthOnly = true means i(T)/i(0) - 1, which is a swap-type setting.
          let IndexedCashFlow = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IIndexedCashFlow_Factory > ()
          /// ! The day counter is usually obtained from the inflation term structure that the inflation index uses for forecasting. There is no gearing or spread because these are relevant for YoY coupons but not zero inflation coupons.  \note inflation indices do not contain day counters or calendars.
          let InflationCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IInflationCoupon_Factory > ()
          /// ! The main reason we can't use FloatingRateCouponPricer as the base is that it takes a FloatingRateCoupon which takes an InterestRateIndex and we need an inflation index (these are lagged).  The basic inflation-specific thing that the pricer has to do is deal with different lags in the index and the option e.g. the option could look 3 months back and the index 2.  We add the requirement that pricers do inverseCap/Floor-lets. These are cap/floor-lets as usually defined, i.e. pay out if underlying is above/below a strike.  The non-inverse (usual) versions are from a coupon point of view (a capped coupon has a maximum at the strike).  We add the inverse prices so that conventional caps can be priced simply.
          let InflationCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IInflationCouponPricer_Factory > ()
          /// ! Prices a cms coupon via static replication as in Hagan's "Conundrums..." article via numerical integration based on prices of vanilla swaptions
          let NumericHaganPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.INumericHaganPricer_Factory > ()
          /// ! %Coupon paying the compounded interest due to daily overnight fixings.
          let OvernightIndexedCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IOvernightIndexedCoupon_Factory > ()
          /// ! helper class building a sequence of overnight coupons
          let OvernightLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IOvernightLeg_Factory > ()
          /// 
          let RangeAccrualFloatersCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IRangeAccrualFloatersCoupon_Factory > ()
          /// ! helper class building a sequence of range-accrual floating-rate coupons
          let RangeAccrualLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IRangeAccrualLeg_Factory > ()
          /// 
          let RangeAccrualPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IRangeAccrualPricer_Factory > ()
          /// 
          let RangeAccrualPricerByBgm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IRangeAccrualPricerByBgm_Factory > ()
          /// ! This class specializes SimpleCashFlow so that visitors can perform more detailed cash-flow analysis.
          let Redemption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IRedemption_Factory > ()
          /// ! Specification of replication strategies used to price the embedded digital option in a digital coupon.
          let Replication = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IReplication_Factory > ()
          /// ! This cash flow pays a predetermined amount at a given date.
          let SimpleCashFlow = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ISimpleCashFlow_Factory > ()
          /// ! Distribution over a number of dates
          let TimeBasket = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.ITimeBasket_Factory > ()
          /// ! Unit-Displaced-Black-formula pricer for capped/floored yoy inflation coupons
          let UnitDisplacedBlackYoYInflationCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IUnitDisplacedBlackYoYInflationCouponPricer_Factory > ()
          /// 
          let VanillaOptionPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IVanillaOptionPricer_Factory > ()
          /// ! %Coupon paying a YoY-inflation type index
          let YoYInflationCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IYoYInflationCoupon_Factory > ()
          /// ! \note this pricer can already do swaplets but to get volatility-dependent coupons you need the descendents.
          let YoYInflationCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IYoYInflationCouponPricer_Factory > ()
          /// ! Helper class building a sequence of capped/floored yoy inflation coupons ! payoff is: spread + gearing x index
          let yoyInflationLeg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Cashflows.IyoyInflationLeg_Factory > ()
        end

      module Currencies =
        begin
          /// ! The ISO three-letter code is ARS; the numeric code is 32. It is divided in 100 centavos.  \ingroup currencies
          let ARSCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IARSCurrency_Factory > ()
          /// ! The ISO three-letter code was ATS; the numeric code was 40. It was divided in 100 groschen.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let ATSCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IATSCurrency_Factory > ()
          /// ! The ISO three-letter code is AUD; the numeric code is 36. It is divided into 100 cents.  \ingroup currencies
          let AUDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IAUDCurrency_Factory > ()
          /// ! The ISO three-letter code is BDT; the numeric code is 50. It is divided in 100 paisa.  \ingroup currencies
          let BDTCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IBDTCurrency_Factory > ()
          /// ! The ISO three-letter code was BEF; the numeric code was 56. It had no subdivisions.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let BEFCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IBEFCurrency_Factory > ()
          /// ! The ISO three-letter code is BGL; the numeric code is 100. It is divided in 100 stotinki.  \ingroup currencies
          let BGLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IBGLCurrency_Factory > ()
          /// ! The ISO three-letter code is BRL; the numeric code is 986. It is divided in 100 centavos.  \ingroup currencies
          let BRLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IBRLCurrency_Factory > ()
          /// ! The ISO three-letter code is BYR; the numeric code is 974. It has no subdivisions.  \ingroup currencies
          let BYRCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IBYRCurrency_Factory > ()
          /// ! The ISO three-letter code is CAD; the numeric code is 124. It is divided into 100 cents.  \ingroup currencies
          let CADCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ICADCurrency_Factory > ()
          /// ! The ISO three-letter code is CHF; the numeric code is 756. It is divided into 100 cents.  \ingroup currencies
          let CHFCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ICHFCurrency_Factory > ()
          /// ! The ISO three-letter code is CLP; the numeric code is 152. It is divided in 100 centavos.  \ingroup currencies
          let CLPCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ICLPCurrency_Factory > ()
          /// ! The ISO three-letter code is CNY; the numeric code is 156. It is divided in 100 fen.  \ingroup currencies
          let CNYCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ICNYCurrency_Factory > ()
          /// ! The ISO three-letter code is COP; the numeric code is 170. It is divided in 100 centavos.  \ingroup currencies
          let COPCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ICOPCurrency_Factory > ()
          /// ! The ISO three-letter code is CYP; the numeric code is 196. It is divided in 100 cents.  \ingroup currencies
          let CYPCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ICYPCurrency_Factory > ()
          /// ! The ISO three-letter code is CZK; the numeric code is 203. It is divided in 100 haleru.  \ingroup currencies
          let CZKCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ICZKCurrency_Factory > ()
          /// ! The ISO three-letter code was DEM; the numeric code was 276. It was divided into 100 pfennig.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let DEMCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IDEMCurrency_Factory > ()
          /// ! The ISO three-letter code is DKK; the numeric code is 208. It is divided in 100 ?re.  \ingroup currencies
          let DKKCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IDKKCurrency_Factory > ()
          /// ! The ISO three-letter code is EEK; the numeric code is 233. It is divided in 100 senti.  \ingroup currencies
          let EEKCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IEEKCurrency_Factory > ()
          /// ! The ISO three-letter code was ESP; the numeric code was 724. It was divided in 100 centimos.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let ESPCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IESPCurrency_Factory > ()
          /// ! The ISO three-letter code is EUR; the numeric code is 978. It is divided into 100 cents.  \ingroup currencies
          let EURCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IEURCurrency_Factory > ()
          /// ! \test lookup of direct, triangulated, and derived exchange rates is tested.
          let ExchangeRateManager = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IExchangeRateManager_Factory > ()
          /// ! The ISO three-letter code was FIM; the numeric code was 246. It was divided in 100 penni?.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let FIMCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IFIMCurrency_Factory > ()
          /// ! The ISO three-letter code was FRF; the numeric code was 250. It was divided in 100 centimes.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let FRFCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IFRFCurrency_Factory > ()
          /// ! The ISO three-letter code is GBP; the numeric code is 826. It is divided into 100 pence.  \ingroup currencies
          let GBPCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IGBPCurrency_Factory > ()
          /// ! The ISO three-letter code was GRD; the numeric code was 300. It was divided in 100 lepta.  Obsoleted by the Euro since 2001.  \ingroup currencies
          let GRDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IGRDCurrency_Factory > ()
          /// ! The ISO three-letter code is HKD; the numeric code is 344. It is divided in 100 cents.  \ingroup currencies
          let HKDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IHKDCurrency_Factory > ()
          /// ! The ISO three-letter code is HUF; the numeric code is 348. It has no subdivisions.  \ingroup currencies
          let HUFCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IHUFCurrency_Factory > ()
          /// ! The ISO three-letter code was IEP; the numeric code was 372. It was divided in 100 pence.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let IEPCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IIEPCurrency_Factory > ()
          /// ! The ISO three-letter code is ILS; the numeric code is 376. It is divided in 100 agorot.  \ingroup currencies
          let ILSCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IILSCurrency_Factory > ()
          /// ! The ISO three-letter code is INR; the numeric code is 356. It is divided in 100 paise.  \ingroup currencies
          let INRCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IINRCurrency_Factory > ()
          /// ! The ISO three-letter code is IQD; the numeric code is 368. It is divided in 1000 fils.  \ingroup currencies
          let IQDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IIQDCurrency_Factory > ()
          /// ! The ISO three-letter code is IRR; the numeric code is 364. It has no subdivisions.  \ingroup currencies
          let IRRCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IIRRCurrency_Factory > ()
          /// ! The ISO three-letter code is ISK; the numeric code is 352. It is divided in 100 aurar.  \ingroup currencies
          let ISKCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IISKCurrency_Factory > ()
          /// ! The ISO three-letter code was ITL; the numeric code was 380. It had no subdivisions.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let ITLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IITLCurrency_Factory > ()
          /// ! The ISO three-letter code is JPY; the numeric code is 392. It is divided into 100 sen.  \ingroup currencies
          let JPYCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IJPYCurrency_Factory > ()
          /// ! The ISO three-letter code is KRW; the numeric code is 410. It is divided in 100 chon.  \ingroup currencies
          let KRWCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IKRWCurrency_Factory > ()
          /// ! The ISO three-letter code is KWD; the numeric code is 414. It is divided in 1000 fils.  \ingroup currencies
          let KWDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IKWDCurrency_Factory > ()
          /// ! The ISO three-letter code is LTL; the numeric code is 440. It is divided in 100 centu.  \ingroup currencies
          let LTLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ILTLCurrency_Factory > ()
          /// ! The ISO three-letter code was LUF; the numeric code was 442. It was divided in 100 centimes.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let LUFCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ILUFCurrency_Factory > ()
          /// ! The ISO three-letter code is LVL; the numeric code is 428. It is divided in 100 santims.  \ingroup currencies
          let LVLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ILVLCurrency_Factory > ()
          /// ! The ISO three-letter code is MTL; the numeric code is 470. It is divided in 100 cents.  \ingroup currencies
          let MTLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IMTLCurrency_Factory > ()
          /// ! The ISO three-letter code is MXN; the numeric code is 484. It is divided in 100 centavos.  \ingroup currencies
          let MXNCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IMXNCurrency_Factory > ()
          /// ! The ISO three-letter code was NLG; the numeric code was 528. It was divided in 100 cents.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let NLGCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.INLGCurrency_Factory > ()
          /// ! The ISO three-letter code is NOK; the numeric code is 578. It is divided in 100 ?re.  \ingroup currencies
          let NOKCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.INOKCurrency_Factory > ()
          /// ! The ISO three-letter code is NPR; the numeric code is 524. It is divided in 100 paise.  \ingroup currencies
          let NPRCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.INPRCurrency_Factory > ()
          /// ! The ISO three-letter code is NZD; the numeric code is 554. It is divided in 100 cents.  \ingroup currencies
          let NZDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.INZDCurrency_Factory > ()
          /// ! The ISO three-letter code was PEH. A numeric code is not available; as per ISO 3166-1, we assign 999 as a user-defined code. It was divided in 100 centavos.  Obsoleted by the inti since February 1985.  \ingroup currencies
          let PEHCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IPEHCurrency_Factory > ()
          /// ! The ISO three-letter code was PEI. It was divided in 100 centimos. A numeric code is not available; as per ISO 3166-1, we assign 998 as a user-defined code.  Obsoleted by the nuevo sol since July 1991.  \ingroup currencies
          let PEICurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IPEICurrency_Factory > ()
          /// ! The ISO three-letter code is PEN; the numeric code is 604. It is divided in 100 centimos.  \ingroup currencies
          let PENCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IPENCurrency_Factory > ()
          /// ! The ISO three-letter code is PKR; the numeric code is 586. It is divided in 100 paisa.  \ingroup currencies
          let PKRCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IPKRCurrency_Factory > ()
          /// ! The ISO three-letter code is PLN; the numeric code is 985. It is divided in 100 groszy.  \ingroup currencies
          let PLNCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IPLNCurrency_Factory > ()
          /// ! The ISO three-letter code was PTE; the numeric code was 620. It was divided in 100 centavos.  Obsoleted by the Euro since 1999.  \ingroup currencies
          let PTECurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IPTECurrency_Factory > ()
          /// ! The ISO three-letter code was ROL; the numeric code was 642. It was divided in 100 bani.  Obsoleted by the new leu since July 2005.  \ingroup currencies
          let ROLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IROLCurrency_Factory > ()
          /// ! The ISO three-letter code is RON; the numeric code is 946. It is divided in 100 bani.  \ingroup currencies
          let RONCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IRONCurrency_Factory > ()
          /// ! The ISO three-letter code is SAR; the numeric code is 682. It is divided in 100 halalat.  \ingroup currencies
          let SARCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ISARCurrency_Factory > ()
          /// ! The ISO three-letter code is SEK; the numeric code is 752. It is divided in 100 ?re.  \ingroup currencies
          let SEKCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ISEKCurrency_Factory > ()
          /// ! The ISO three-letter code is SGD; the numeric code is 702. It is divided in 100 cents.  \ingroup currencies
          let SGDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ISGDCurrency_Factory > ()
          /// ! The ISO three-letter code is SIT; the numeric code is 705. It is divided in 100 stotinov.  \ingroup currencies
          let SITCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ISITCurrency_Factory > ()
          /// ! The ISO three-letter code is SKK; the numeric code is 703. It is divided in 100 halierov.  \ingroup currencies
          let SKKCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ISKKCurrency_Factory > ()
          /// ! The ISO three-letter code is THB; the numeric code is 764. It is divided in 100 stang.  \ingroup currencies
          let THBCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ITHBCurrency_Factory > ()
          /// ! The ISO three-letter code was TRL; the numeric code was 792. It was divided in 100 kurus.  Obsoleted by the new Turkish lira since 2005.  \ingroup currencies
          let TRLCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ITRLCurrency_Factory > ()
          /// ! The ISO three-letter code is TRY; the numeric code is 949. It is divided in 100 new kurus.  \ingroup currencies
          let TRYCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ITRYCurrency_Factory > ()
          /// ! The ISO three-letter code is TTD; the numeric code is 780. It is divided in 100 cents.  \ingroup currencies
          let TTDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ITTDCurrency_Factory > ()
          /// ! The ISO three-letter code is TWD; the numeric code is 901. It is divided in 100 cents.  \ingroup currencies
          let TWDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.ITWDCurrency_Factory > ()
          /// ! The ISO three-letter code is USD; the numeric code is 840. It is divided in 100 cents.  \ingroup currencies
          let USDCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IUSDCurrency_Factory > ()
          /// ! The ISO three-letter code is VEB; the numeric code is 862. It is divided in 100 centimos.  \ingroup currencies
          let VEBCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IVEBCurrency_Factory > ()
          /// ! The ISO three-letter code is ZAR; the numeric code is 710. It is divided into 100 cents.  \ingroup currencies
          let ZARCurrency = Cephei.Core.FactoryFinder.Find<Cephei.QL.Currencies.IZARCurrency_Factory > ()
        end

      module Experimental =
        begin
          /// ! base class for convertible bonds
          let ConvertibleBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IConvertibleBond_Factory > ()
          /// ! \warning Most methods inherited from Bond (such as yield or the yield-based dirtyPrice and cleanPrice) refer to the underlying plain-vanilla bond and do not take convertibility and callability into account.
          let ConvertibleFixedCouponBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IConvertibleFixedCouponBond_Factory > ()
          /// ! \warning Most methods inherited from Bond (such as yield or the yield-based dirtyPrice and cleanPrice) refer to the underlying plain-vanilla bond and do not take convertibility and callability into account.
          let ConvertibleFloatingRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IConvertibleFloatingRateBond_Factory > ()
          /// ! \warning Most methods inherited from Bond (such as yield or the yield-based dirtyPrice and cleanPrice) refer to the underlying plain-vanilla bond and do not take convertibility and callability into account.
          let ConvertibleZeroCouponBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IConvertibleZeroCouponBond_Factory > ()
          /// 
          let DiscretizedConvertible = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IDiscretizedConvertible_Factory > ()
          /// 
          let EverestMultiPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IEverestMultiPathPricer_Factory > ()
          /// 
          let EverestOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IEverestOption_Factory > ()
          /// 
          let HimalayaMultiPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IHimalayaMultiPathPricer_Factory > ()
          /// ! The payoff of a Himalaya option is computed in the following way: Given a basket of N assets, and N time periods, at the end of each period the option who performed the best is added to the average and then discarded from the basket. At the end of the N, periods the option pays the max between the strike and the average of the best performers.  \warning This implementation still does not manage seasoned options.
          let HimalayaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IHimalayaOption_Factory > ()
          /// 
          let PagodaMultiPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IPagodaMultiPathPricer_Factory > ()
          /// ! The payoff is a given fraction multiplied by the minimum between a given roof and the positive portfolio performance. If the performance of the portfolio is below then the payoff is null.  \warning This implementation still does not manage seasoned options.  \ingroup instruments
          let PagodaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.IPagodaOption_Factory > ()
          /// ! %callability leaving to the holder the possibility to convert
          let SoftCallability = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.ISoftCallability_Factory > ()

          module Amortizingbonds =
            begin
              /// ! amortizing CMS-rate bond
              let AmortizingCmsRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Amortizingbonds.IAmortizingCmsRateBond_Factory > ()
              /// ! amortizing fixed-rate bond
              let AmortizingFixedRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Amortizingbonds.IAmortizingFixedRateBond_Factory > ()
              /// ! amortizing floating-rate bond (possibly capped and/or floored)
              let AmortizingFloatingRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Amortizingbonds.IAmortizingFloatingRateBond_Factory > ()
            end

          module Barrieroption =
            begin
              /// ! This engine implements the approach described in <http://www.econ.univpm.it/recchioni/finance/w3/>.  \ingroup barrierengines
              let PerturbativeBarrierOptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Barrieroption.IPerturbativeBarrierOptionEngine_Factory > ()
            end

          module Callablebonds =
            begin
              /// ! Callable fixed rate bond Black engine. The embedded (European) option follows the Black "European bond option" treatment in Hull, Fourth Edition, Chapter 20.  \todo set additionalResults (e.g. vega, fairStrike, etc.)  \warning This class has yet to be tested  \ingroup callablebondengines
              let BlackCallableFixedRateBondEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.IBlackCallableFixedRateBondEngine_Factory > ()
              /// ! Callable zero coupon bond, where the embedded (European) option price is assumed to obey the Black formula. Follows "European bond option" treatment in Hull, Fourth Edition, Chapter 20.  \warning This class has yet to be tested.  \ingroup callablebondengines
              let BlackCallableZeroCouponBondEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.IBlackCallableZeroCouponBondEngine_Factory > ()
              /// ! Base callable bond class for fixed and zero coupon bonds. Defines commonalities between fixed and zero coupon callable bonds. At present, only European and Bermudan put/call schedules supported (no American optionality), as defined by the Callability class.  \todo models/shortrate/calibrationHelpers \todo OAS/OAD \todo floating rate callable bonds ?  \ingroup instruments
              let CallableBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.ICallableBond_Factory > ()
              /// ! Constant callable-bond volatility, no time-strike dependence
              let CallableBondConstantVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.ICallableBondConstantVolatility_Factory > ()
              /// ! This class is purely abstract and defines the interface of concrete callable-bond volatility structures which will be derived from this one.
              let CallableBondVolatilityStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.ICallableBondVolatilityStructure_Factory > ()
              /// ! Callable fixed rate bond class.  \ingroup instruments  <b> Example: </b> \link CallableBonds.cpp \endlink
              let CallableFixedRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.ICallableFixedRateBond_Factory > ()
              /// ! Callable zero coupon bond class.  \ingroup instruments
              let CallableZeroCouponBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.ICallableZeroCouponBond_Factory > ()
              /// 
              let DiscretizedCallableFixedRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.IDiscretizedCallableFixedRateBond_Factory > ()
              /// ! \ingroup callablebondengines
              let TreeCallableFixedRateBondEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.ITreeCallableFixedRateBondEngine_Factory > ()
              /// ! \ingroup callablebondengines
              let TreeCallableZeroCouponBondEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Callablebonds.ITreeCallableZeroCouponBondEngine_Factory > ()
            end

          module Commodities =
            begin
              /// 
              let BarrelUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IBarrelUnitOfMeasure_Factory > ()
              /// ! \ingroup instruments
              let Commodity = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommodity_Factory > ()
              /// 
              let CommodityCashFlow = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommodityCashFlow_Factory > ()
              /// ! Commodity term structure
              let CommodityCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommodityCurve_Factory > ()
              /// ! base class for commodity indexes
              let CommodityIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommodityIndex_Factory > ()
              /// ! commodity index helper
              let CommodityPricingHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommodityPricingHelper_Factory > ()
              /// ! global repository for run-time library settings
              let CommoditySettings = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommoditySettings_Factory > ()
              /// ! commodity type
              let CommodityType = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommodityType_Factory > ()
              /// 
              let CommodityUnitCost = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ICommodityUnitCost_Factory > ()
              /// ! \ingroup datetime
              let DateInterval = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IDateInterval_Factory > ()
              /// ! Energy basis swap
              let EnergyBasisSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IEnergyBasisSwap_Factory > ()
              /// ! \ingroup instruments
              let EnergyCommodity = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IEnergyCommodity_Factory > ()
              /// 
              let EnergyDailyPosition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IEnergyDailyPosition_Factory > ()
              /// ! \ingroup instruments
              let EnergyFuture = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IEnergyFuture_Factory > ()
              /// 
              let EnergySwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IEnergySwap_Factory > ()
              /// ! Vanilla energy swap
              let EnergyVanillaSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IEnergyVanillaSwap_Factory > ()
              /// 
              let ExchangeContract = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IExchangeContract_Factory > ()
              /// 
              let GallonUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IGallonUnitOfMeasure_Factory > ()
              /// 
              let KilolitreUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IKilolitreUnitOfMeasure_Factory > ()
              /// 
              let LitreUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ILitreUnitOfMeasure_Factory > ()
              /// 
              let LotUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ILotUnitOfMeasure_Factory > ()
              /// 
              let MBUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IMBUnitOfMeasure_Factory > ()
              /// 
              let MTUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IMTUnitOfMeasure_Factory > ()
              /// 
              let NullCommodityType = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.INullCommodityType_Factory > ()
              /// 
              let PaymentTerm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IPaymentTerm_Factory > ()
              /// 
              let PricingError = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IPricingError_Factory > ()
              /// ! \ingroup datetime
              let PricingPeriod = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IPricingPeriod_Factory > ()
              /// ! Amount of a commodity
              let Quantity = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IQuantity_Factory > ()
              /// 
              let TokyoKilolitreUnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.ITokyoKilolitreUnitOfMeasure_Factory > ()
              /// ! %Unit of measure specification
              let UnitOfMeasure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IUnitOfMeasure_Factory > ()
              /// 
              let UnitOfMeasureConversion = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IUnitOfMeasureConversion_Factory > ()
              /// ! \test lookup of direct unit of measure conversion is tested.
              let UnitOfMeasureConversionManager = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Commodities.IUnitOfMeasureConversionManager_Factory > ()
            end

          module Compoundoption =
            begin
              /// ! The formulas are taken from "Foreign Exchange Risk", Uwe Wystup, Risk 2002, where closed form Greeks are available. (not available in Haug 2007). Value: Page 84, Greeks: Pages 94-95.  \test the correctness of the returned value is tested by reproducing results available in literature.
              let AnalyticCompoundOptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Compoundoption.IAnalyticCompoundOptionEngine_Factory > ()
              /// ! \ingroup instruments
              let CompoundOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Compoundoption.ICompoundOption_Factory > ()
              /// Helper Class needed to solve an implicit problem of finding a spot to a corresponding option price.
              let ImpliedSpotHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Compoundoption.IImpliedSpotHelper_Factory > ()
            end

          module Convertiblebonds =
            begin
            end

          module Coupons =
            begin
              /// 
              let AveragingRatePricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Coupons.IAveragingRatePricer_Factory > ()
              /// 
              let BlackIborQuantoCouponPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Coupons.IBlackIborQuantoCouponPricer_Factory > ()
              /// 
              let CompoundingRatePricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Coupons.ICompoundingRatePricer_Factory > ()
              /// ! IborIndex calculated as proxy of some other IborIndex
              let ProxyIbor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Coupons.IProxyIbor_Factory > ()
              /// 
              let SubPeriodsCoupon = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Coupons.ISubPeriodsCoupon_Factory > ()
              /// 
              let SubPeriodsPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Coupons.ISubPeriodsPricer_Factory > ()
            end

          module Credit =
            begin
              /// risky-asset-swap helper for probability-curve bootstrap
              let AssetSwapHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IAssetSwapHelper_Factory > ()
              /// ! Default types defined as enum to allow easy aggregation of types. Theres an event algebra logic by default provided by DefaultType. If your new type requires more sofisticated test you need to derive from it as in FailureToPay
              let AtomicDefault = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IAtomicDefault_Factory > ()
              /// ------------------------------------------------------------------------
              let BankruptcyEvent = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IBankruptcyEvent_Factory > ()
              /// ! Credit Basket.  A basket is a collection of credit names, represented by a unique identifier (a text string), associated notional amounts, a pool and tranche information. The pool is a map of "names" to issuers.  The Basket structure is motivated by CDO squared instruments containing various underlying inner CDOs which can be represented by respective baskets including their tranche structure.  The role of the Pool is providing a unique list of relevant issuers while names may appear multiple times across different baskets (overlap).
              let Basket = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IBasket_Factory > ()
              /// ! Probability of at least N events
              let BinomialProbabilityOfAtLeastNEvents = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IBinomialProbabilityOfAtLeastNEvents_Factory > ()
              /// ! \warning The engine assumes that the exercise date equals the start date of the passed CDS.
              let BlackCdsOptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IBlackCdsOptionEngine_Factory > ()
              /// ! The instrument prices a mezzanine CDO tranche with loss given default between attachment point \f$ D_1\f$ and detachment point \f$ D_2 > D_1 \f$.  For purchased protection, the instrument value is given by the difference of the protection value \f$ V_1 \f$ and premium value \f$ V_2 \f$,  \f[ V = V_1 - V_2. \f]  The protection leg is priced as follows:  - Build the probability distribution for volume of defaults \f$ L \f$ (before recovery) or Loss Given Default \f$ LGD = (1-r)\,L \f$ at times/dates \f$ t_i, i=1, ..., N\f$ (premium schedule times with intermediate steps) - Determine the expected value \f$ E_i = E_{t_i}\,\left[Pay(LGD)\right] \f$ of the protection payoff \f$ Pay(LGD) \f$ at each time \f$ t_i\f$ where \f[ Pay(L) = min (D_1, LGD) - min (D_2, LGD) = \left\{ \begin{array}{lcl} \displaystyle 0 &;& LGD < D_1 \\ \displaystyle LGD - D_1 &;& D_1 \leq LGD \leq D_2 \\ \displaystyle D_2 - D_1 &;& LGD > D_2 \end{array} \right. \f] - The protection value is then calculated as \f[ V_1 \:=\: \sum_{i=1}^N (E_i - E_{i-1}) \cdot  d_i \f] where \f$ d_i\f$ is the discount factor at time/date \f$ t_i \f$  The premium is paid on the protected notional amount, initially \f$ D_2 - D_1. \f$ This notional amount is reduced by the expected protection payments \f$ E_i \f$ at times \f$ t_i, \f$ so that the premium value is calculated as  \f[ V_2 = m \, \cdot \sum_{i=1}^N \,(D_2 - D_1 - E_i) \cdot \Delta_{i-1,i}\,d_i \f]  where \f$ m \f$ is the premium rate, \f$ \Delta_{i-1, i}\f$ is the day count fraction between date/time \f$ t_{i-1}\f$ and \f$ t_i.\f$  The construction of the portfolio loss distribution \f$ E_i \f$ is based on the probability bucketing algorithm described in  <strong> John Hull and Alan White, "Valuation of a CDO and nth to default CDS without Monte Carlo simulation", Journal of Derivatives 12, 2, 2004 </strong>  The pricing algorithm allows for varying notional amounts and default termstructures of the underlyings.  \todo Investigate and fix cases \f$ E_{i+1} < E_i. \f$
              let CDO = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ICDO_Factory > ()
              /// ! The side of the swaption is set by choosing the side of the CDS. A receiver CDS option is a right to buy an underlying CDS selling protection and receiving a coupon. A payer CDS option is a right to buy an underlying CDS buying protection and paying coupon.
              let CdsOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ICdsOption_Factory > ()
              /// ! Simple Recovery Rate model returning the constant value of the quote independently of the date and the seniority.
              let ConstantRecoveryModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IConstantRecoveryModel_Factory > ()
              /// @class DefaultEvent @brief Credit event on a bond of a certain seniority(ies)/currency  Represents a credit event affecting all bonds with a given \ seniority and currency. It assumes that all such bonds suffer \ the event simultaneously. Some events affect all seniorities and this has to be encoded through a different set of events of the same event type. The event is an actual realization, not a contractual reference, as such it contains only an atomic type.
              let DefaultEvent = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IDefaultEvent_Factory > ()
              /// ! Used to index market implied credit curve probabilities. It is a proxy to the defaultable bond or class of bonds which determines the credit contract conditions.  It aggregates the atomic default types in a group defining the contract conditions and which serves to index the probability curves calibrated to the market.
              let DefaultProbKey = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IDefaultProbKey_Factory > ()
              /// ! This class encapsulates the ISDA default contractual types and their combinations. Non-atomicity works only at the atomic type level, obviating the specific event characteristics which it is accounted for only in derived classes.
              let DefaultType = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IDefaultType_Factory > ()
              /// 
              let Distribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IDistribution_Factory > ()
              /// ! \note This term structure will remain linked to the original structure, i.e., any changes in the latter will be reflected in this structure as well.  \ingroup termstructures
              let FactorSpreadedHazardRateCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IFactorSpreadedHazardRateCurve_Factory > ()
              /// ! Failure to Pay atomic event type.
              let FailureToPay = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IFailureToPay_Factory > ()
              /// ------------------------------------------------------------------------
              let FailureToPayEvent = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IFailureToPayEvent_Factory > ()
              /// ! Random default times using a one-factor Gaussian copula.
              let GaussianRandomDefaultModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IGaussianRandomDefaultModel_Factory > ()
              /// -------------------------------------------------------------------------- ! CDO base engine taking (possibly) small time steps
              let IntegralCDOEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IIntegralCDOEngine_Factory > ()
              /// 
              let Issuer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IIssuer_Factory > ()
              /// 
              let Loss = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ILoss_Factory > ()
              /// ! \ingroup probability
              let LossDist = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ILossDist_Factory > ()
              /// ! Binomial loss distribution \ingroup probability
              let LossDistBinomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ILossDistBinomial_Factory > ()
              /// ! Loss distribution with Hull-White bucketing  Loss distribution for varying volumes and probabilities of default, independence assumed.  The implementation of the loss distribution follows  John Hull and Alan White, "Valuation of a CDO and nth to default CDS without Monte Carlo simulation", Journal of Derivatives 12, 2, 2004.  \ingroup probability
              let LossDistBucketing = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ILossDistBucketing_Factory > ()
              /// ! Loss Distribution for Homogeneous Pool  Loss distribution for equal volumes but varying probabilities of default.  The method builds the exact loss distribution for a homogeneous pool of underlyings iteratively by computing the convolution of the given loss distribution with the "loss distribution" of an additional credit following  Xiaofong Ma, "Numerical Methods for the Valuation of Synthetic Collateralized Debt Obligations", PhD Thesis, Graduate Department of Computer Science, University of Toronto, 2007 http://www.cs.toronto.edu/pub/reports/na/ma-07-phd.pdf (formula 2.1)  avoiding numerical instability of the algorithm by  John Hull and Alan White, "Valuation of a CDO and nth to default CDS without Monte Carlo simulation", Journal of Derivatives 12, 2, 2004  \ingroup probability
              let LossDistHomogeneous = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ILossDistHomogeneous_Factory > ()
              /// ! Loss distribution for varying volumes and probabilities of default via Monte Carlo simulation of independent default events.  \ingroup probability
              let LossDistMonteCarlo = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ILossDistMonteCarlo_Factory > ()
              /// 
              let ManipulateDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IManipulateDistribution_Factory > ()
              /// -------------------------------------------------------------------------- ! CDO base engine taking schedule steps
              let MidPointCDOEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IMidPointCDOEngine_Factory > ()
              /// -------------------------------------------------------------------------- ! CDO engine, Monte Carlo for the exptected tranche loss distribution
              let MonteCarloCDOEngine1 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IMonteCarloCDOEngine1_Factory > ()
              /// -------------------------------------------------------------------------- ! CDO engine, Monte Carlo for the sample payoff
              let MonteCarloCDOEngine2 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IMonteCarloCDOEngine2_Factory > ()
              /// ! ISDA standard default contractual key for corporate US debt. Restructuring here can be set to NoRestructuring.
              let NorthAmericaCorpDefaultKey = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.INorthAmericaCorpDefaultKey_Factory > ()
              /// ! A NTD instrument exchanges protection against the nth default in a basket of underlying credits for premium payments based on the protected notional amount.  The pricing is analogous to the pricing of a CDS instrument which represents protection against default of a single underlying credit.  The only difference is the calculation of the probability of default.  In the CDS case, it is the probabilty of single name default; in the NTD case the probability of at least N defaults in the portfolio of underlying credits.  This probability is computed using the algorithm in John Hull and Alan White, "Valuation of a CDO and nth to default CDS without Monte Carlo simulation", Journal of Derivatives 12, 2, 2004.  The algorithm allows for varying probability of default across the basket. Otherwise, for identical probabilities of default, the probability of n defaults is given by the binomial distribution.  Default correlation is modeled using a one-factor Gaussian copula approach.  The class is tested against data in Hull-White (see reference above.)
              let NthToDefault = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.INthToDefault_Factory > ()
              /// ! Reference: John Hull and Alan White, The Perfect Copula, June 2006  Let \f$Q_i(t)\f$ be the cumulative probability of default of counterparty i before time t.  In a one-factor model, consider random variables \f[ Y_i = a_i\,M+\sqrt{1-a_i^2}\:Z_i \f] where \f$M\f$ and \f$Z_i\f$ have independent zero-mean unit-variance distributions and \f$-1\leq a_i \leq 1\f$.  The correlation between \f$Y_i\f$ and \f$Y_j\f$ is then \f$a_i a_j\f$.  Let \f$F_Y(y)\f$ be the cumulative distribution function of \f$Y_i\f$. \f$y\f$ is mapped to \f$t\f$ such that percentiles match, i.e. \f$F_Y(y)=Q_i(t)\f$ or \f$y=F_Y^{-1}(Q_i(t))\f$.  Now let \f$F_Z(z)\f$ be the cumulated distribution function of \f$Z_i\f$.  For given realization of \f$M\f$, this determines the distribution of \f$y\f$: \f[ Prob \,(Y_i &lt; y|M) = F_Z \left( \frac{y-a_i\,M}{\sqrt{1-a_i^2}}\right) \qquad \mbox{or} \qquad Prob \,(t_i &lt; t|M) = F_Z \left( \frac{F_Y^{-1}(Q_i(t))-a_i\,M} {\sqrt{1-a_i^2}} \right) \f]  The distribution functions of \f$ M, Z_i \f$ are specified in derived classes. The distribution function of \f$ Y \f$ is then given by the convolution \f[ F_Y(y) = Prob\,(Y&lt;y) = \int_{-\infty}^\infty\,\int_{-\infty}^{\infty}\: D_Z(z)\,D_M(m) \quad \Theta \left(y - a\,m - \sqrt{1-a^2}\,z\right)\,dm\,dz, \qquad \Theta (x) = \left\{ \begin{array}{ll} 1 &amp; x \geq 0 \\ 0 &amp; x &lt; 0 \end{array}\right. \f] where \f$ D_Z(z) \f$ and \f$ D_M(m) \f$ are the probability densities of \f$ Z\f$ and \f$ M, \f$ respectively.  This convolution can also be written \f[ F(y) = Prob \,(Y &lt; y) = \int_{-\infty}^\infty D_M(m)\,dm\: \int_{-\infty}^{g(y,a,m)} D_Z(z)\,dz, \qquad g(y,a,m) = \frac{y - a\cdot m}{\sqrt{1-a^2}}, \qquad a &lt; 1 \f]  or  \f[ F(y) = Prob \,(Y &lt; y) = \int_{-\infty}^\infty D_Z(z)\,dz\: \int_{-\infty}^{h(y,a,z)} D_M(m)\,dm, \qquad h(y,a,z) = \frac{y - \sqrt{1 - a^2}\cdot z}{a}, \qquad a &gt; 0. \f]  In general, \f$ F_Y(y) \f$ needs to be computed numerically.  \todo Improve on simple Euler integration
              let OneFactorCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IOneFactorCopula_Factory > ()
              /// ! The copula model \f[ Y_i = a_i\,M+\sqrt{1-a_i^2}\:Z_i \f] is specified here by setting the desnity function for all variables, \f$ M, Z,\f$ and also \f$ Y \f$ to the standard normal distribution \f$ \phi(x) = \exp(-x^2/2) / \sqrt{2\pi}. \f$
              let OneFactorGaussianCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IOneFactorGaussianCopula_Factory > ()
              /// ! The copula model \f[ Y_i = a_i\,M+\sqrt{1-a_i^2}\:Z_i \f]  is specified here by setting the probability density functions for \f$ Z_i \f$ (\f$ D_Z \f$) to a Student t-distributions with \f$ N_z \f$ degrees of freedom, and for \f$ M \f$ (\f$ D_M \f$) to a Gaussian.  The variance of the Student t-distribution with \f$ \nu \f$ degrees of freedom is \f$ \nu / (\nu - 2) \f$. Since the copula approach requires zero mean and unit variance distributions, \f$ Z \f$ is scaled by \f$ \sqrt{(N_z - 2) / N_z}.\f$  \todo Improve performance/accuracy of the calculation of inverse cumulative Y. Tabulate and store it for selected correlations?
              let OneFactorGaussianStudentCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IOneFactorGaussianStudentCopula_Factory > ()
              /// ! The copula model \f[ Y_i = a_i\,M+\sqrt{1-a_i^2}\:Z_i \f]  is specified here by setting the probability density functions for \f$ Z_i \f$ (\f$ D_Z \f$) and \f$ M \f$ (\f$ D_M \f$) to Student t-distributions with \f$ N_z \f$ and \f$ N_m \f$ degrees of freedom, respectively.  The variance of the Student t-distribution with \f$ \nu \f$ degrees of freedom is \f$ \nu / (\nu - 2) \f$. Since the copula approach requires zero mean and unit variance distributions, variables \f$ Z \f$ and \f$ M \f$ are scaled by \f$ \sqrt{(N_z - 2) / N_z} \f$ and \f$ \sqrt{(N_m - 2) / N_m}, \f$ respectively.  \todo Improve performance/accuracy of the calculation of inverse cumulative Y. Tabulate and store it for selected correlations?
              let OneFactorStudentCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IOneFactorStudentCopula_Factory > ()
              /// ! The copula model \f[ Y_i = a_i\,M+\sqrt{1-a_i^2}\:Z_i \f] is specified here by setting the probability density functions for \f$ Z_i \f$ (\f$ D_Z \f$) to a Gaussian and for \f$ M \f$ (\f$ D_M \f$) to a Student t-distribution with \f$ N_m \f$ degrees of freedom.  The variance of the Student t-distribution with \f$ \nu \f$ degrees of freedom is \f$ \nu / (\nu - 2) \f$. Since the copula approach requires zero mean and unit variance distributions, \f$ M \f$ is scaled by \f$ \sqrt{(N_m - 2) / N_m}. \f$  \todo Improve performance/accuracy of the calculation of inverse cumulative Y. Tabulate and store it for selected correlations?
              let OneFactorStudentGaussianCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IOneFactorStudentGaussianCopula_Factory > ()
              /// 
              let Pool = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IPool_Factory > ()
              /// ! Probability of at least N events
              let ProbabilityOfAtLeastNEvents = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IProbabilityOfAtLeastNEvents_Factory > ()
              /// ! Probability of N events
              let ProbabilityOfNEvents = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IProbabilityOfNEvents_Factory > ()
              /// ! Provides sequences of random default times for each name in the pool.
              let RandomDefaultModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRandomDefaultModel_Factory > ()
              /// ! Models of the recovery rate provide future values of a recovery rate in the event of a default.
              let RecoveryRateModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRecoveryRateModel_Factory > ()
              /// ! Restructuring type
              let Restructuring = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRestructuring_Factory > ()
              /// ! Risky asset-swap instrument
              let RiskyAssetSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRiskyAssetSwap_Factory > ()
              /// ! \ingroup credit
              let RiskyAssetSwapOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRiskyAssetSwapOption_Factory > ()
              /// ! Base class for default risky bonds \ingroup credit
              let RiskyBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRiskyBond_Factory > ()
              /// ! Default risky fixed bond \ingroup credit
              let RiskyFixedBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRiskyFixedBond_Factory > ()
              /// ! Default risky floating bonds \ingroup credit
              let RiskyFloatingBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.IRiskyFloatingBond_Factory > ()
              /// ! \note This term structure will remain linked to the original structure, i.e., any changes in the latter will be reflected in this structure as well.  \ingroup termstructures
              let SpreadedHazardRateCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ISpreadedHazardRateCurve_Factory > ()
              /// ! The instrument prices a mezzanine CDO tranche with loss given default between attachment point \f$ D_1\f$ and detachment point \f$ D_2 > D_1 \f$.  For purchased protection, the instrument value is given by the difference of the protection value \f$ V_1 \f$ and premium value \f$ V_2 \f$,  \f[ V = V_1 - V_2. \f]  The protection leg is priced as follows:  - Build the probability distribution for volume of defaults \f$ L \f$ (before recovery) or Loss Given Default \f$ LGD = (1-r)\,L \f$ at times/dates \f$ t_i, i=1, ..., N\f$ (premium schedule times with intermediate steps)  - Determine the expected value \f$ E_i = E_{t_i}\,\left[Pay(LGD)\right] \f$ of the protection payoff \f$ Pay(LGD) \f$  at each time \f$ t_i\f$ where \f[ Pay(L) = min (D_1, LGD) - min (D_2, LGD) = \left\{ \begin{array}{lcl} \displaystyle 0 &;& LGD < D_1 \\ \displaystyle LGD - D_1 &;& D_1 \leq LGD \leq D_2 \\ \displaystyle D_2 - D_1 &;& LGD > D_2 \end{array} \right. \f]  - The protection value is then calculated as \f[ V_1 \:=\: \sum_{i=1}^N (E_i - E_{i-1}) \cdot  d_i \f] where \f$ d_i\f$ is the discount factor at time/date \f$ t_i \f$  The premium is paid on the protected notional amount, initially \f$ D_2 - D_1. \f$ This notional amount is reduced by the expected protection payments \f$ E_i \f$ at times \f$ t_i, \f$ so that the premium value is calculated as  \f[ V_2 = m \, \cdot \sum_{i=1}^N \,(D_2 - D_1 - E_i) \cdot \Delta_{i-1,i}\,d_i \f]  where \f$ m \f$ is the premium rate, \f$ \Delta_{i-1, i}\f$ is the day count fraction between date/time \f$ t_{i-1}\f$ and \f$ t_i.\f$  The construction of the portfolio loss distribution \f$ E_i \f$ is based on the probability bucketing algorithm described in  <strong> John Hull and Alan White, "Valuation of a CDO and nth to default CDS without Monte Carlo simulation", Journal of Derivatives 12, 2, 2004 </strong>  The pricing algorithm allows for varying notional amounts and default termstructures of the underlyings.  \ingroup credit  \todo Investigate and fix cases \f$ E_{i+1} < E_i. \f$
              let SyntheticCDO = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Credit.ISyntheticCDO_Factory > ()
            end

          module Exoticoptions =
            begin
              /// ! This class implements formulae from "The Value of an American Option to Exchange One Asset for Another", W. Margrabe, Journal of Finance, 33, 177-86.  \test the correctness of the returned value is tested by reproducing results available in literature.
              let AnalyticAmericanMargrabeEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IAnalyticAmericanMargrabeEngine_Factory > ()
              /// ! This class implements formulae from "The Value of an Option to Exchange One Asset for Another", W. Margrabe, Journal of Finance, 33 (March 1978), 177-186.  \test the correctness of the returned value is tested by reproducing results available in literature.
              let AnalyticEuropeanMargrabeEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IAnalyticEuropeanMargrabeEngine_Factory > ()
              /// ! This class implements a Simple Chooser Option option, with European exercise.
              let AnalyticSimpleChooserEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IAnalyticSimpleChooserEngine_Factory > ()
              /// ! Analytic engine for writer-extensible options
              let AnalyticWriterExtensibleOptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IAnalyticWriterExtensibleOptionEngine_Factory > ()
              /// 
              let ContinuousArithmeticAsianLevyEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IContinuousArithmeticAsianLevyEngine_Factory > ()
              /// ! Kirk approximation for European spread option on futures
              let KirkSpreadOptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IKirkSpreadOptionEngine_Factory > ()
              /// ! This option gives the holder the right to exchange Q2 stocks of the second asset for Q1 stocks of the first at expiration.  \ingroup instruments
              let MargrabeOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IMargrabeOption_Factory > ()
              /// ! This option gives the holder the right to choose, at a future date prior to exercise, whether the option should be a call or a put.  The exercise date and strike are the same for both call and put option.
              let SimpleChooserOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.ISimpleChooserOption_Factory > ()
              /// ! Spread option on two assets
              let SpreadOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.ISpreadOption_Factory > ()
              /// ! Writer-extensible option
              let WriterExtensibleOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Exoticoptions.IWriterExtensibleOption_Factory > ()
            end

          module Finitedifferences =
            begin
              /// 
              let FdExtOUJumpVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdExtOUJumpVanillaEngine_Factory > ()
              /// 
              let FdKlugeExtOUSpreadEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdKlugeExtOUSpreadEngine_Factory > ()
              /// 
              let FdmExpExtOUInnerValueCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmExpExtOUInnerValueCalculator_Factory > ()
              /// 
              let FdmExtendedOrnsteinUhlenbackOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmExtendedOrnsteinUhlenbackOp_Factory > ()
              /// 
              let FdmExtOUJumpModelInnerValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmExtOUJumpModelInnerValue_Factory > ()
              /// ! References: Kluge, Timo L., 2008. Pricing Swing Options and other Electricity Derivatives, http://eprints.maths.ox.ac.uk/246/1/kluge.pdf
              let FdmExtOUJumpOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmExtOUJumpOp_Factory > ()
              /// 
              let FdmExtOUJumpSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmExtOUJumpSolver_Factory > ()
              /// ! References: Kluge, Timo L., 2008. Pricing Swing Options and other Electricity Derivatives, http://eprints.maths.ox.ac.uk/246/1/kluge.pdf  http://spanderen.de/2011/06/13/vpp-pricing-i-stochastic-processes-partial-integro-differential-equation/
              let FdmKlugeExtOUOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmKlugeExtOUOp_Factory > ()
              /// 
              let FdmSimple2dExtOUSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmSimple2dExtOUSolver_Factory > ()
              /// 
              let FdmSimple3dExtOUJumpSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmSimple3dExtOUJumpSolver_Factory > ()
              /// 
              let FdmSpreadPayoffInnerValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmSpreadPayoffInnerValue_Factory > ()
              /// 
              let FdmVPPStepCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdmVPPStepCondition_Factory > ()
              /// 
              let FdSimpleExtOUJumpSwingEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdSimpleExtOUJumpSwingEngine_Factory > ()
              /// 
              let FdSimpleExtOUStorageEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdSimpleExtOUStorageEngine_Factory > ()
              /// 
              let FdSimpleKlugeExtOUVPPEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IFdSimpleKlugeExtOUVPPEngine_Factory > ()
              /// 
              let VanillaVPPOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Finitedifferences.IVanillaVPPOption_Factory > ()
            end

          module Fx =
            begin
              /// ! Class includes many operations needed for different applications in FX markets, which has special quoation mechanisms, since every price can be expressed in both numeraires.
              let BlackDeltaCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Fx.IBlackDeltaCalculator_Factory > ()
              /// 
              let BlackDeltaPremiumAdjustedMaxStrikeClass = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Fx.IBlackDeltaPremiumAdjustedMaxStrikeClass_Factory > ()
              /// 
              let BlackDeltaPremiumAdjustedSolverClass = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Fx.IBlackDeltaPremiumAdjustedSolverClass_Factory > ()
              /// ! It includes the various delta quotation types in FX markets as well as ATM types.
              let DeltaVolQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Fx.IDeltaVolQuote_Factory > ()
            end

          module Inflation =
            begin
              /// ! The inflation index MUST contain a ZeroInflationTermStructure as this is used to create ATM.  Unlike YoY price surfaces we assume that 1) an ATM ZeroInflationTermStructure is available and 2) that it is safe to use it.  This is supported by the fact that no stripping is required for CPI cap/floors as they only give one flow.  cpi cap/floors have a single (one) flow (unlike nominal caps) because they observe cumulative inflation up to their maturity.  Options are on CPI(T)/CPI(0) but strikes are quoted for yearly average inflation, so require transformation via (1+quote)^T to obtain actual strikes.  These are consistent with ZCIIS quoting conventions.  The observationLag is that for the referenced instrument prices. Strikes are as-quoted not as-used.
              let CPICapFloorTermPriceSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.ICPICapFloorTermPriceSurface_Factory > ()
              /// ! Generic CPI index
              let GenericCPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IGenericCPI_Factory > ()
              /// ! Generic geographical/economic region
              let GenericRegion = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IGenericRegion_Factory > ()
              /// ! This engine only adds timing functionality (e.g. different lag) ! w.r.t. an existing interpolated price surface.
              let InterpolatingCPICapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IInterpolatingCPICapFloorEngine_Factory > ()
              /// ! polynomial2D-spline-interpolation factory
              let Polynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IPolynomial_Factory > ()
              /// ! polynomial2D-spline interpolation between discrete points
              let Polynomial2DSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IPolynomial2DSpline_Factory > ()
              /// ! Since this can create a yoy term structure it does take a YoY index.  \todo deal with index interpolation.
              let YoYCapFloorTermPriceSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IYoYCapFloorTermPriceSurface_Factory > ()
              /// ! traits for inflation-volatility bootstrap
              let YoYInflationVolatilityTraits = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IYoYInflationVolatilityTraits_Factory > ()
              /// ! Year-on-year inflation-volatility bootstrap helper.
              let YoYOptionletHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IYoYOptionletHelper_Factory > ()
              /// ! Strippers return K slices of the volatility surface at a given T. In initialize they actually do the stripping along each K.
              let YoYOptionletStripper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IYoYOptionletStripper_Factory > ()
              /// ! Genuine year-on-year Generic CPI (i.e. not a ratio)
              let YYGenericCPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IYYGenericCPI_Factory > ()
              /// ! Fake year-on-year GenericCPI (i.e. a ratio)
              let YYGenericCPIr = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Inflation.IYYGenericCPIr_Factory > ()
            end

          module Lattices =
            begin
              /// ! \ingroup lattices
              let ExtendedAdditiveEQPBinomialTree = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Lattices.IExtendedAdditiveEQPBinomialTree_Factory > ()
              /// ! \ingroup lattices
              let ExtendedCoxRossRubinstein = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Lattices.IExtendedCoxRossRubinstein_Factory > ()
              /// ! \ingroup lattices
              let ExtendedJarrowRudd = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Lattices.IExtendedJarrowRudd_Factory > ()
              /// 
              let ExtendedJoshi4 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Lattices.IExtendedJoshi4_Factory > ()
              /// ! \ingroup lattices
              let ExtendedLeisenReimer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Lattices.IExtendedLeisenReimer_Factory > ()
              /// ! \ingroup lattices
              let ExtendedTian = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Lattices.IExtendedTian_Factory > ()
              /// ! \ingroup lattices
              let ExtendedTrigeorgis = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Lattices.IExtendedTrigeorgis_Factory > ()
            end

          module Math =
            begin
              /// ! FFT implementation
              let FastFourierTransform = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Math.IFastFourierTransform_Factory > ()
              /// RNG traits for Ziggurat generator
              let Ziggurat = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Math.IZiggurat_Factory > ()
              /// ! This generator returns standard normal variates using the Ziggurat method.  The underlying RNG is mt19937 (32 bit version). The algorithm is described in Marsaglia and Tsang (2000). "The Ziggurat Method for Generating Random Variables". Journal of Statistical Software 5 (8).  Note that step 2 from the above paper reuses the rightmost 8 bits of the random integer, which creates correlation between steps 1 and 2.  This implementation was written from scratch, following Marsaglia and Tsang.  It avoids the correlation by using only the leftmost 24 bits of mt19937's output.  Note that the GNU GSL implementation uses a different value for the right-most step. The GSL value is somewhat different from the one reported by Marsaglia and Tsang because GSL uses a different tail. This implementation uses the same right-most step as reported by Marsaglia and Tsang.  The generator was put through Marsaglia's Diehard battery of tests and didn't exibit any abnormal behavior.
              let ZigguratRng = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Math.IZigguratRng_Factory > ()
            end

          module Mcbasket =
            begin
              /// 
              let AdaptedPathPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Mcbasket.IAdaptedPathPayoff_Factory > ()
              /// 
              let EuropeanPathMultiPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Mcbasket.IEuropeanPathMultiPathPricer_Factory > ()
              /// ! References:  Francis Longstaff, Eduardo Schwartz, 2001. Valuing American Options by Simulation: A Simple Least-Squares Approach, The Review of Financial Studies, Volume 14, No. 1, 113-147  \ingroup mcarlo  \test the correctness of the returned value is tested by reproducing results available in web/literature
              let LongstaffSchwartzMultiPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Mcbasket.ILongstaffSchwartzMultiPathPricer_Factory > ()
              /// ! Base class for path-dependent options on multiple assets
              let PathMultiAssetOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Mcbasket.IPathMultiAssetOption_Factory > ()
              /// ! Abstract base class for path-dependent option payoffs
              let PathPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Mcbasket.IPathPayoff_Factory > ()
            end

          module Processes =
            begin
              /// ! This class allows to choose a built-in discretization scheme  \ingroup processes
              let ExtendedBlackScholesMertonProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Processes.IExtendedBlackScholesMertonProcess_Factory > ()
              /// ! This class describes the Ornstein-Uhlenbeck process governed by \f[ dx = a (b(t) - x_t) dt + \sigma dW_t. \f]  \ingroup processes
              let ExtendedOrnsteinUhlenbeckProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Processes.IExtendedOrnsteinUhlenbeckProcess_Factory > ()
              /// 
              let ExtOUWithJumpsProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Processes.IExtOUWithJumpsProcess_Factory > ()
              /// ! This class describes the Geman-Roncoroni process governed by \f[ \begin{array}{rcl} dE(t) &=& \left[ \frac{\partial}{\partial t} \mu(t) +\theta_1 \left(\mu(t)-E(t^-)\right)\right]dt +\sigma dW(t) + h(E(t^-))dJ(t) \\ \mu(t)&=& \alpha + \beta t +\gamma \cos(\epsilon+2\pi t) +\delta \cos(\zeta + 4\pi t) \end{array} \f]  \ingroup processes
              let GemanRoncoroniProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Processes.IGemanRoncoroniProcess_Factory > ()
              /// 
              let KlugeExtOUProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Processes.IKlugeExtOUProcess_Factory > ()
              /// ! Black-Scholes process which supports local vega stress tests
              let VegaStressedBlackScholesProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Processes.IVegaStressedBlackScholesProcess_Factory > ()
            end

          module Risk =
            begin
            end

          module Shortrate =
            begin
              /// ! This class implements the standard Black-Karasinski model defined by \f[ d f(r_t) = (\theta(t) - \alpha f(r_t))dt + \sigma dW_t, \f] where \f$ alpha \f$ and \f$ sigma \f$ are piecewise linear functions.  \ingroup shortrate
              let GeneralizedHullWhite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Shortrate.IGeneralizedHullWhite_Factory > ()
              /// ! This class describes the Ornstein-Uhlenbeck process governed by \f[ dx = a (level - x_t) dt + \sigma dW_t \f]  \ingroup processes  where the coefficients a and sigma are piecewise linear.
              let GeneralizedOrnsteinUhlenbeckProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Shortrate.IGeneralizedOrnsteinUhlenbeckProcess_Factory > ()
            end

          module Variancegamma =
            begin
              /// ! \ingroup vanillaengines  The FFT engine calculates the values of all options with the same expiry at the same time. For that reason it is very inefficient to price options individually.  When using this engine you should collect all the options you wish to price in a list and call the engine's precalculate method before calling the NPV method of the option. References: Carr, P. and D. B. Madan (1998), "Option Valuation using the fast Fourier transform," Journal of Computational Finance, 2, 61-73.
              let FFTEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Variancegamma.IFFTEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned values is tested by comparison with Black Scholes pricing.
              let FFTVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Variancegamma.IFFTVanillaEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned values is tested by comparison with known good values and the analytic approach
              let FFTVarianceGammaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Variancegamma.IFFTVarianceGammaEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned values is tested by checking it against known good results.
              let VarianceGammaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Variancegamma.IVarianceGammaEngine_Factory > ()
              /// ! References:  Dilip B. Madan, Peter Carr, Eric C. Chang (1998) "The variance gamma process and option pricing," European Finance Review, 2, 79-105  \warning calibration is not implemented for VG
              let VarianceGammaModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Variancegamma.IVarianceGammaModel_Factory > ()
              /// ! This class describes the stochastic volatility process.  With a Brownian motion given by \f[ db = \theta dt + \sigma dW_t \f] then a Variance Gamma process X is defined by evaluating this Brownian motion at sample times driven by a Gamma process. If T is the value of a Gamma process with mean 1 and variance rate \f$ \nu \f$ then the Variance Gamma process is given by \f[ X(t) = B(T) \f]  \ingroup processes
              let VarianceGammaProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Variancegamma.IVarianceGammaProcess_Factory > ()
            end

          module Varianceoption =
            begin
              /// ! This engine implements the approach described in <http://www.econ.univpm.it/recchioni/finance/w4/>.  \ingroup forwardengines
              let IntegralHestonVarianceOptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Varianceoption.IIntegralHestonVarianceOptionEngine_Factory > ()
              /// ! \warning This class does not manage seasoned variance options.  \ingroup instruments
              let VarianceOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Varianceoption.IVarianceOption_Factory > ()
            end

          module Volatility =
            begin
              /// ! blah blah
              let AbcdAtmVolCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IAbcdAtmVolCurve_Factory > ()
              /// ! This abstract class defines the interface of concrete Black at-the-money (no-smile) volatility curves which will be derived from this one.  Volatilities are assumed to be expressed on an annual basis.
              let BlackAtmVolCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IBlackAtmVolCurve_Factory > ()
              /// ! This abstract class defines the interface of concrete Black volatility (smile) surface which will be derived from this one.  Volatilities are assumed to be expressed on an annual basis.
              let BlackVolSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IBlackVolSurface_Factory > ()
              /// ! This abstract class defines the interface of concrete Equity/FX volatility (smile) surfaces which will be derived from this one.  Volatilities are assumed to be expressed on an annual basis.  It's only in absence of smile that the concept of (at-the-money) forward volatility makes sense.
              let EquityFXVolSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IEquityFXVolSurface_Factory > ()
              /// ! This class is similar to BlackVarianceCurve, but extends it to use quotes for the input volatilities.
              let ExtendedBlackVarianceCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IExtendedBlackVarianceCurve_Factory > ()
              /// ! This class is similar to BlackVarianceSurface, but extends it to use quotes for the input volatilities.
              let ExtendedBlackVarianceSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IExtendedBlackVarianceSurface_Factory > ()
              /// ! This abstract class defines the interface of concrete Interest rate volatility (smile) surfaces which will be derived from this one.  Volatilities are assumed to be expressed on an annual basis.
              let InterestRateVolSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IInterestRateVolSurface_Factory > ()
              /// ! blah blah
              let SabrVolSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.ISabrVolSurface_Factory > ()
              /// 
              let VolatilityCube = Cephei.Core.FactoryFinder.Find<Cephei.QL.Experimental.Volatility.IVolatilityCube_Factory > ()
            end
        end

      module Indexes =
        begin
          /// ! Australia as geographical/economic region
          let AustraliaRegion = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IAustraliaRegion_Factory > ()
          /// ! The BMA index is the short-term tax-exempt reference index of the Bond Market Association.  It has tenor one week, is fixed weekly on Wednesdays and is applied with a one-day's fixing gap from Thursdays on for one week.  It is the tax-exempt correspondent of the 1M USD-Libor.
          let BMAIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IBMAIndex_Factory > ()
          /// ! European Union as geographical/economic region
          let EURegion = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IEURegion_Factory > ()
          /// ! France as geographical/economic region
          let FranceRegion = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IFranceRegion_Factory > ()
          /// ! base class for Inter-Bank-Offered-Rate indexes (e.g. %Libor, etc.)
          let IborIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IIborIndex_Factory > ()
          /// ! Base class for inflation-rate indexes,
          let InflationIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IInflationIndex_Factory > ()
          /// ! \todo add methods returning InterestRate
          let InterestRateIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IInterestRateIndex_Factory > ()
          /// 
          let OvernightIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IOvernightIndex_Factory > ()
          /// ! base class for overnight indexed swap indexes
          let OvernightIndexedSwapIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IOvernightIndexedSwapIndex_Factory > ()
          /// ! Region class, used for inflation applicability.
          let Region = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IRegion_Factory > ()
          /// ! base class for swap-rate indexes
          let SwapIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.ISwapIndex_Factory > ()
          /// ! United Kingdom as geographical/economic region
          let UKRegion = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IUKRegion_Factory > ()
          /// ! USA as geographical/economic region
          let USRegion = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IUSRegion_Factory > ()
          /// ! These may be genuine indices published on, say, Bloomberg, or "fake" indices that are defined as the ratio of an index at different time points.
          let YoYInflationIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IYoYInflationIndex_Factory > ()
          /// ! Base class for zero inflation indices.
          let ZeroInflationIndex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.IZeroInflationIndex_Factory > ()

          module Ibor =
            begin
              /// ! Australian Dollar LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let AUDLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IAUDLibor_Factory > ()
              /// ! Canadian Dollar LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.  \warning This is the rate fixed in London by BBA. Use CDOR if you're interested in the Canadian fixing by IDA.
              let CADLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ICADLibor_Factory > ()
              /// ! Overnight %CAD %Libor index
              let CADLiborON = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ICADLiborON_Factory > ()
              /// ! Canadian Dollar Offered Rate fixed by IDA.  \warning This is the rate fixed in Canada by IDA. Use CADLibor if you're interested in the London fixing by BBA.  \todo check settlement days, end-of-month adjustment, and day-count convention.
              let Cdor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ICdor_Factory > ()
              /// ! Swiss Franc LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.  \warning This is the rate fixed in London by BBA. Use ZIBOR if you're interested in the Zurich fixing.
              let CHFLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ICHFLibor_Factory > ()
              /// ! base class for the one day deposit BBA %CHF %LIBOR indexes
              let DailyTenorCHFLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IDailyTenorCHFLibor_Factory > ()
              /// ! Euro O/N LIBOR fixed by BBA. It can be also used for T/N and S/N indexes, even if such indexes do not have BBA fixing.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.  \warning This is the rate fixed in London by BBA. Use Eonia if you're interested in the fixing by the ECB.
              let DailyTenorEURLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IDailyTenorEURLibor_Factory > ()
              /// ! base class for the one day deposit BBA %GBP %LIBOR indexes
              let DailyTenorGBPLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IDailyTenorGBPLibor_Factory > ()
              /// ! base class for the one day deposit BBA %JPY %LIBOR indexes
              let DailyTenorJPYLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IDailyTenorJPYLibor_Factory > ()
              /// ! One day deposit LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let DailyTenorLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IDailyTenorLibor_Factory > ()
              /// ! base class for the one day deposit BBA %USD %LIBOR indexes
              let DailyTenorUSDLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IDailyTenorUSDLibor_Factory > ()
              /// ! Danish Krona LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let DKKLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IDKKLibor_Factory > ()
              /// ! %Eonia (Euro Overnight Index Average) rate fixed by the ECB.
              let Eonia = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IEonia_Factory > ()
              /// ! Euribor rate fixed by the ECB.  \warning This is the rate fixed by the ECB. Use EurLibor if you're interested in the London fixing by BBA.
              let Euribor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IEuribor_Factory > ()
              /// ! Euro LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.  \warning This is the rate fixed in London by BBA. Use Euribor if you're interested in the fixing by the ECB.
              let EURLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IEURLibor_Factory > ()
              /// ! Pound Sterling LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let GBPLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IGBPLibor_Factory > ()
              /// ! Overnight %GBP %Libor index
              let GBPLiborON = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IGBPLiborON_Factory > ()
              /// ! Johannesburg Interbank Agreed Rate  \todo check settlement days and day-count convention.
              let Jibar = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IJibar_Factory > ()
              /// ! Japanese Yen LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.  \warning This is the rate fixed in London by BBA. Use TIBOR if you're interested in the Tokio fixing.
              let JPYLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IJPYLibor_Factory > ()
              /// ! LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let Libor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ILibor_Factory > ()
              /// ! New Zealand Dollar LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let NZDLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.INZDLibor_Factory > ()
              /// ! Sweden Krone LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let SEKLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ISEKLibor_Factory > ()
              /// ! %Sonia (Sterling Overnight Index Average) rate.
              let Sonia = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ISonia_Factory > ()
              /// ! Tokyo Interbank Offered Rate.  \warning This is the rate fixed in Tokio by JBA. Use JPYLibor if you're interested in the London fixing by BBA.  \todo check settlement days and end-of-month adjustment.
              let Tibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ITibor_Factory > ()
              /// ! TRY LIBOR fixed by TBA.  See <http://www.trlibor.org/trlibor/english/default.asp>  \todo check end-of-month adjustment.
              let TRLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.ITRLibor_Factory > ()
              /// ! US Dollar LIBOR fixed by BBA.  See <http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1414>.
              let USDLibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IUSDLibor_Factory > ()
              /// ! Overnight %USD %Libor index
              let USDLiborON = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IUSDLiborON_Factory > ()
              /// ! Zurich Interbank Offered Rate.  \warning This is the rate fixed in Zurich by BBA. Use CHFLibor if you're interested in the London fixing by BBA.  \todo check settlement days, end-of-month adjustment, and day-count convention.
              let Zibor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Ibor.IZibor_Factory > ()
            end

          module Inflation =
            begin
              /// ! AU CPI index (either quarterly or annual)
              let AUCPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IAUCPI_Factory > ()
              /// ! EU HICP index
              let EUHICP = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IEUHICP_Factory > ()
              /// ! EU HICPXT index
              let EUHICPXT = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IEUHICPXT_Factory > ()
              /// ! FR HICP index
              let FRHICP = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IFRHICP_Factory > ()
              /// ! UK Retail Price Inflation Index
              let UKRPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IUKRPI_Factory > ()
              /// ! US CPI index
              let USCPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IUSCPI_Factory > ()
              /// ! Genuine year-on-year AU CPI (i.e. not a ratio)
              let YYAUCPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYAUCPI_Factory > ()
              /// ! Fake year-on-year AUCPI (i.e. a ratio)
              let YYAUCPIr = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYAUCPIr_Factory > ()
              /// ! Genuine year-on-year EU HICP (i.e. not a ratio of EU HICP)
              let YYEUHICP = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYEUHICP_Factory > ()
              /// ! Fake year-on-year EU HICP (i.e. a ratio of EU HICP)
              let YYEUHICPr = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYEUHICPr_Factory > ()
              /// ! Genuine year-on-year EU HICPXT
              let YYEUHICPXT = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYEUHICPXT_Factory > ()
              /// ! Genuine year-on-year FR HICP (i.e. not a ratio)
              let YYFRHICP = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYFRHICP_Factory > ()
              /// ! Fake year-on-year FR HICP (i.e. a ratio)
              let YYFRHICPr = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYFRHICPr_Factory > ()
              /// ! Genuine year-on-year UK RPI (i.e. not a ratio of UK RPI)
              let YYUKRPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYUKRPI_Factory > ()
              /// ! Fake year-on-year UK RPI (i.e. a ratio of UK RPI)
              let YYUKRPIr = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYUKRPIr_Factory > ()
              /// ! Genuine year-on-year US CPI (i.e. not a ratio of US CPI)
              let YYUSCPI = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYUSCPI_Factory > ()
              /// ! Fake year-on-year US CPI (i.e. a ratio of US CPI)
              let YYUSCPIr = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Inflation.IYYUSCPIr_Factory > ()
            end

          module Swap =
            begin
              /// ! %CHF %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 11am London. Annual 30/360 vs 6M Libor, 1Y vs 3M Libor. Reuters page ISDAFIX4 or CHFSFIX=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let ChfLiborSwapIsdaFix = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IChfLiborSwapIsdaFix_Factory > ()
              /// ! %EUR %Libor %Swap indexes published by IFR Markets and distributed by Reuters page TGM42281 and by Telerate. Annual 30/360 vs 6M Libor, 1Y vs 3M Libor. For more info see <http://www.ifrmarkets.com>.
              let EurLiborSwapIfrFix = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IEurLiborSwapIfrFix_Factory > ()
              /// ! %EUR %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 10am London. Annual 30/360 vs 6M Libor, 1Y vs 3M Libor. Reuters page ISDAFIX2 or EURSFIXLA=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let EurLiborSwapIsdaFixA = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IEurLiborSwapIsdaFixA_Factory > ()
              /// ! %EUR %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 11am London. Annual 30/360 vs 6M Libor, 1Y vs 3M Libor. Reuters page ISDAFIX2 or EURSFIXLB=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let EurLiborSwapIsdaFixB = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IEurLiborSwapIsdaFixB_Factory > ()
              /// ! %GBP %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 11am London. Semiannual Actual/365F vs 6M Libor, 1Y Annual vs 3M Libor. Reuters page ISDAFIX4 or GBPSFIX=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let GbpLiborSwapIsdaFix = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IGbpLiborSwapIsdaFix_Factory > ()
              /// ! %JPY %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 10am Tokyo. Semiannual Act/365 vs 6M Libor. Reuters page ISDAFIX1 or JPYSFIXA=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let JpyLiborSwapIsdaFixAm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IJpyLiborSwapIsdaFixAm_Factory > ()
              /// ! %JPY %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 3pm Tokyo. Semiannual Act/365 vs 6M Libor. Reuters page ISDAFIX1 or JPYSFIXP=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let JpyLiborSwapIsdaFixPm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IJpyLiborSwapIsdaFixPm_Factory > ()
              /// ! %USD %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 11am New York. Semiannual 30/360 vs 3M Libor. Reuters page ISDAFIX1 or USDSFIX=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let UsdLiborSwapIsdaFixAm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IUsdLiborSwapIsdaFixAm_Factory > ()
              /// ! %USD %Libor %Swap indexes fixed by ISDA in cooperation with Reuters and Intercapital Brokers at 3pm New York. Semiannual 30/360 vs 3M Libor. Reuters page ISDAFIX1 or USDSFIXP=.  Further info can be found at <http://www.isda.org/fix/isdafix.html> or Reuters page ISDAFIX.
              let UsdLiborSwapIsdaFixPm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Indexes.Swap.IUsdLiborSwapIsdaFixPm_Factory > ()
            end
        end

      module Instruments =
        begin
          /// ! Binary asset-or-nothing payoff
          let AssetOrNothingPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IAssetOrNothingPayoff_Factory > ()
          /// ! for mechanics of par asset swap and market asset swap, refer to "Introduction to Asset Swap", Lehman Brothers European Fixed Income Research - January 2000, D. O'Kane  \ingroup instruments  \warning bondCleanPrice must be the (forward) price at the floatSchedule start date  \bug fair prices are not calculated correctly when using indexed coupons.
          let AssetSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IAssetSwap_Factory > ()
          /// ! Placeholder for enumerated averaging types
          let Average = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IAverage_Factory > ()
          /// 
          let AverageBasketPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IAverageBasketPayoff_Factory > ()
          /// ! Placeholder for enumerated barrier types
          let Barrier = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBarrier_Factory > ()
          /// ! The analytic pricing engine will be used if none if passed.  \ingroup instruments
          let BarrierOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBarrierOption_Factory > ()
          /// ! \ingroup instruments
          let BasketOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBasketOption_Factory > ()
          /// 
          let BasketPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBasketPayoff_Factory > ()
          /// ! swap paying Libor against BMA coupons
          let BMASwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBMASwap_Factory > ()
          /// ! Derived classes must fill the uninitialized data members.  \warning Most methods assume that the cash flows are stored sorted by date, the redemption(s) being after any cash flow at the same date. In particular, if there's one single redemption, it must be the last cash flow,  \ingroup instruments  \test - price/yield calculations are cross-checked for consistency. - price/yield calculations are checked against known good values.
          let Bond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBond_Factory > ()
          /// ASC091228 moved from nested class
          let BondArguments = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBondArguments_Factory > ()
          /// ASC091228 moved from nested class
          let BondResults = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IBondResults_Factory > ()
          /// ASC021127 ! %instrument callability
          let Callability = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICallability_Factory > ()
          /// ASC091127 Moved price from being a sub-class so that it can be instantiated directly ! amount to be paid upon callability
          let CallabilityPrice = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICallabilityPrice_Factory > ()
          /// ! \ingroup instruments
          let Cap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICap_Factory > ()
          /// ! \ingroup instruments  \test - the correctness of the returned value is tested by checking that the price of a cap (resp. floor) decreases (resp. increases) with the strike rate. - the relationship between the values of caps, floors and the resulting collars is checked. - the put-call parity between the values of caps, floors and swaps is checked. - the correctness of the returned implied volatility is tested by using it for reproducing the target value. - the correctness of the returned value is tested by checking it against a known good value.
          let CapFloor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICapFloor_Factory > ()
          /// ! Binary cash-or-nothing payoff
          let CashOrNothingPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICashOrNothingPayoff_Factory > ()
          /// ! Claim associated to a default event
          let Claim = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IClaim_Factory > ()
          /// ! A cliquet option, also known as Ratchet option, is a series of forward-starting (a.k.a. deferred strike) options where the strike for each forward start option is set equal to a fixed percentage of the spot price at the beginning of each period.  \todo - add local/global caps/floors - add accrued coupon and last fixing  \ingroup instruments
          let CliquetOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICliquetOption_Factory > ()
          /// ! \ingroup instruments
          let Collar = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICollar_Factory > ()
          /// ! This instrument is an aggregate of other instruments. Its NPV is the sum of the NPVs of its components, each possibly multiplied by a given factor.  <b>Example: </b> \link Replication.cpp static replication of a down-and-out barrier option \endlink  \warning Methods that drive the calculation directly (such as recalculate(), freeze() and others) might not work correctly.  \ingroup instruments
          let CompositeInstrument = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICompositeInstrument_Factory > ()
          /// ! \todo add running average  \ingroup instruments
          let ContinuousAveragingAsianOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IContinuousAveragingAsianOption_Factory > ()
          /// ! \ingroup instruments
          let ContinuousFixedLookbackOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IContinuousFixedLookbackOption_Factory > ()
          /// ! \ingroup instruments
          let ContinuousFloatingLookbackOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IContinuousFloatingLookbackOption_Factory > ()
          /// ! Quoted as a fixed strike rate \f$ K \f$.  Payoff: \f[ P_n(0,T) \max(y (N [(1+K)^{T}-1] - N \left[ \frac{I(T)}{I(0)} -1 \right]), 0) \f] where \f$ T \f$ is the maturity time, \f$ P_n(0,t) \f$ is the nominal discount factor at time \f$ t \f$, \f$ N \f$ is the notional, and \f$ I(t) \f$ is the inflation index value at time \f$ t \f$.  Inflation is generally available on every day, including holidays and weekends.  Hence there is a variable to state whether the observe/fix dates for inflation are adjusted or not.  The default is not to adjust.  N.B. a cpi cap or floor is an option, not a cap or floor on a coupon. Thus this is very similar to a ZCIIS and has a single flow, this is as usual for cpi because it is cumulative up to option maturity from base date.  We do not inherit from Option, although this would be reasonable, because we do not have that degree of generality.
          let CPICapFloor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICPICapFloor_Factory > ()
          /// ! fixed x zero-inflation, i.e. fixed x CPI(i'th fixing)/CPI(base) versus floating + spread  Note that this does ony the inflation-vs-floating-leg. Extension to inflation-vs-fixed-leg.  is simple - just replace the floating leg with a fixed leg.  Typically there are notional exchanges at the end: either inflated-notional vs notional; or just (inflated-notional - notional) vs zero.  The latter is perhaphs more typical. \warning Setting subtractInflationNominal to true means that the original inflation nominal is subtracted from both nominals before they are exchanged, even if they are different.  This swap can mimic a ZCIIS where [(1+q)^n - 1] is exchanged against (cpi ratio - 1), by using differnt nominals on each leg and setting subtractInflationNominal to true.  ALSO - there must be just one date in each schedule.  The two legs can have different schedules, fixing (days vs lag), settlement, and roll conventions.  N.B. accrual adjustment periods are already in the schedules.  Trade date and swap settlement date are outside the scope of the instrument.
          let CPISwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICPISwap_Factory > ()
          /// ! \note This instrument currently assumes that the issuer did not default until today's date.  \warning if <tt>Settings::includeReferenceDateCashFlows()</tt> is set to <tt>true</tt>, payments occurring at the settlement date of the swap might be included in the NPV and therefore affect the fair-spread calculation. This might not be what you want.  \ingroup instruments
          let CreditDefaultSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ICreditDefaultSwap_Factory > ()
          /// ! \ingroup instruments
          let DiscreteAveragingAsianOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IDiscreteAveragingAsianOption_Factory > ()
          /// ! \ingroup instruments
          let DividendBarrierOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IDividendBarrierOption_Factory > ()
          /// ! \ingroup instruments
          let DividendVanillaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IDividendVanillaOption_Factory > ()
          /// ! Intermediate class for single/double sticky/ratchet payoffs. initialValues can be a (forward) rate or a coupon/accrualFactor
          let DoubleStickyRatchetPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IDoubleStickyRatchetPayoff_Factory > ()
          /// ! \ingroup instruments
          let EuropeanOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IEuropeanOption_Factory > ()
          /// ! Claim on the notional of a reference security, including accrual
          let FaceValueAccrualClaim = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IFaceValueAccrualClaim_Factory > ()
          /// ! Claim on a notional
          let FaceValueClaim = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IFaceValueClaim_Factory > ()
          /// ! 1. valueDate refers to the settlement date of the bond forward contract.  maturityDate is the delivery (or repurchase) date for the underlying bond (not the bond's maturity date).  2. Relevant formulas used in the calculations (\f$P\f$ refers to a price):  a. \f$ P_{CleanFwd}(t) = P_{DirtyFwd}(t) - AI(t=deliveryDate) \f$ where \f$ AI \f$ refers to the accrued interest on the underlying bond.  b. \f$ P_{DirtyFwd}(t) = \frac{P_{DirtySpot}(t) - SpotIncome(t)} {discountCurve->discount(t=deliveryDate)} \f$  c. \f$ SpotIncome(t) = \sum_i \left( CF_i \times incomeDiscountCurve->discount(t_i) \right) \f$ where \f$ CF_i \f$ represents the ith bond cash flow (coupon payment) associated with the underlying bond falling between the settlementDate and the deliveryDate. (Note the two different discount curves used in b. and c.)  <b>Example: </b> \link Repo.cpp valuation of a repo on a fixed-rate bond \endlink  \todo Add preconditions and tests  \todo Create switch- if coupon goes to seller is toggled on, don't consider income in the \f$ P_{DirtyFwd}(t) \f$ calculation.  \todo Verify this works when the underlying is paper (in which case ignore all AI.)  \warning This class still needs to be rigorously tested  \ingroup instruments
          let FixedRateBondForward = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IFixedRateBondForward_Factory > ()
          /// ! %Payoff based on a floating strike
          let FloatingTypePayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IFloatingTypePayoff_Factory > ()
          /// ! \ingroup instruments
          let Floor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IFloor_Factory > ()
          /// ! Derived classes must implement the virtual functions spotValue() (NPV or spot price) and spotIncome() associated with the specific relevant underlying (e.g. bond, stock, commodity, loan/deposit). These functions must be used to set the protected member variables underlyingSpotValue_ and underlyingIncome_ within performCalculations() in the derived class before the base-class implementation is called.  spotIncome() refers generically to the present value of coupons, dividends or storage costs.  discountCurve_ is the curve used to discount forward contract cash flows back to the evaluation day, as well as to obtain forward values for spot values/prices.  incomeDiscountCurve_, which for generality is not automatically set to the discountCurve_, is the curve used to discount future income/dividends/storage-costs etc back to the evaluation date.  \todo Add preconditions and tests  \warning This class still needs to be rigorously tested  \ingroup instruments
          let Forward = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IForward_Factory > ()
          /// 
          let ForwardRateAgreement = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IForwardRateAgreement_Factory > ()
          /// ! Class for forward type payoffs
          let ForwardTypePayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IForwardTypePayoff_Factory > ()
          /// ! \ingroup instruments
          let ForwardVanillaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IForwardVanillaOption_Factory > ()
          /// ! This payoff is equivalent to being a) long a PlainVanillaPayoff at the first strike (same Call/Put type) and b) short a CashOrNothingPayoff at the first strike (same Call/Put type) with cash payoff equal to the difference between the second and the first strike. \warning this payoff can be negative depending on the strikes
          let GapPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IGapPayoff_Factory > ()
          /// ! This class provides a more comfortable way to instantiate standard market cap and floor.
          let MakeCapFloor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMakeCapFloor_Factory > ()
          /// ! This class provides a more comfortable way to instantiate standard market constant maturity swap.
          let MakeCms = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMakeCms_Factory > ()
          /// ! This class provides a more comfortable way to instantiate overnight indexed swaps.
          let MakeOIS = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMakeOIS_Factory > ()
          /// ! This class provides a more comfortable way to instantiate standard market swaption.
          let MakeSwaption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMakeSwaption_Factory > ()
          /// ! This class provides a more comfortable way to instantiate standard market swap.
          let MakeVanillaSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMakeVanillaSwap_Factory > ()
          /// ! This class provides a more comfortable way to instantiate standard yoy inflation cap and floor.
          let MakeYoYInflationCapFloor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMakeYoYInflationCapFloor_Factory > ()
          /// 
          let MaxBasketPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMaxBasketPayoff_Factory > ()
          /// 
          let MinBasketPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMinBasketPayoff_Factory > ()
          /// ! Base class for options on multiple assets
          let MultiAssetOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IMultiAssetOption_Factory > ()
          /// ! Dummy %payoff class
          let NullPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.INullPayoff_Factory > ()
          /// ! Base class for options on a single asset
          let OneAssetOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IOneAssetOption_Factory > ()
          /// ! Overnight indexed swap: fix vs compounded overnight rate
          let OvernightIndexedSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IOvernightIndexedSwap_Factory > ()
          /// ! %Payoff with strike expressed as percentage
          let PercentageStrikePayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IPercentageStrikePayoff_Factory > ()
          /// ! Plain-vanilla payoff
          let PlainVanillaPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IPlainVanillaPayoff_Factory > ()
          /// ! \ingroup instruments
          let QuantoBarrierOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IQuantoBarrierOption_Factory > ()
          /// ! \ingroup instruments
          let QuantoForwardVanillaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IQuantoForwardVanillaOption_Factory > ()
          /// ! \ingroup instruments
          let QuantoVanillaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IQuantoVanillaOption_Factory > ()
          /// ! RatchetMax payoff (double option)
          let RatchetMaxPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IRatchetMaxPayoff_Factory > ()
          /// ! RatchetMin payoff (double option)
          let RatchetMinPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IRatchetMinPayoff_Factory > ()
          /// ! Ratchet payoff (single option)
          let RatchetPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IRatchetPayoff_Factory > ()
          /// ! %settlement information
          let Settlement = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ISettlement_Factory > ()
          /// 
          let SpreadBasketPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ISpreadBasketPayoff_Factory > ()
          /// ! StickyMax payoff (double option)
          let StickyMaxPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IStickyMaxPayoff_Factory > ()
          /// ! StickyMin payoff (double option)
          let StickyMinPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IStickyMinPayoff_Factory > ()
          /// ! Sticky payoff (single option)
          let StickyPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IStickyPayoff_Factory > ()
          /// ! \ingroup instruments
          let Stock = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IStock_Factory > ()
          /// ! Intermediate class for payoffs based on a fixed strike
          let StrikedTypePayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IStrikedTypePayoff_Factory > ()
          /// ! This payoff is equivalent to being (1/lowerstrike) a) long (short) an AssetOrNothing Call (Put) at the lower strike and b) short (long) an AssetOrNothing Call (Put) at the higher strike
          let SuperFundPayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ISuperFundPayoff_Factory > ()
          /// ! Binary supershare payoff
          let SuperSharePayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ISuperSharePayoff_Factory > ()
          /// ! The cash flows belonging to the first leg are paid; the ones belonging to the second leg are received.  \ingroup instruments
          let Swap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ISwap_Factory > ()
          /// ! \ingroup instruments  \test - the correctness of the returned value is tested by checking that the price of a payer (resp. receiver) swaption decreases (resp. increases) with the strike. - the correctness of the returned value is tested by checking that the price of a payer (resp. receiver) swaption increases (resp. decreases) with the spread. - the correctness of the returned value is tested by checking it against that of a swaption on a swap with no spread and a correspondingly adjusted fixed rate. - the correctness of the returned value is tested by checking it against a known good value. - the correctness of the returned value of cash settled swaptions is tested by checking the modified annuity against a value calculated without using the Swaption class.   \todo add greeks and explicit exercise lag
          let Swaption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ISwaption_Factory > ()
          /// ! A Swing option can only be exercised at a set of fixed date times
          let SwingExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ISwingExercise_Factory > ()
          /// ! Intermediate class for put/call payoffs
          let TypePayoff = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.ITypePayoff_Factory > ()
          /// ! \ingroup instruments
          let VanillaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IVanillaOption_Factory > ()
          /// ! base option class
          let VanillaStorageOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IVanillaStorageOption_Factory > ()
          /// ! \ingroup instruments  If no payment convention is passed, the convention of the floating-rate schedule is used.  \warning if <tt>Settings::includeReferenceDateCashFlows()</tt> is set to <tt>true</tt>, payments occurring at the settlement date of the swap might be included in the NPV and therefore affect the fair-rate and fair-spread calculation. This might not be what you want.  \test - the correctness of the returned value is tested by checking that the price of a swap paying the fair fixed rate is null. - the correctness of the returned value is tested by checking that the price of a swap receiving the fair floating-rate spread is null. - the correctness of the returned value is tested by checking that the price of a swap decreases with the paid fixed rate. - the correctness of the returned value is tested by checking that the price of a swap increases with the received floating-rate spread. - the correctness of the returned value is tested by checking it against a known good value.
          let VanillaSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IVanillaSwap_Factory > ()
          /// ! base option class
          let VanillaSwingOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IVanillaSwingOption_Factory > ()
          /// ! \warning This class does not manage seasoned variance swaps.  \ingroup instruments
          let VarianceSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IVarianceSwap_Factory > ()
          /// ! Quoted as a fixed rate \f$ K \f$.  At start: \f[ \sum_{i=1}^{M} P_n(0,t_i) N K = \sum_{i=1}^{M} P_n(0,t_i) N \left[ \frac{I(t_i)}{I(t_i-1)} - 1 \right] \f] where \f$ t_M \f$ is the maturity time, \f$ P_n(0,t) \f$ is the nominal discount factor at time \f$ t \f$, \f$ N \f$ is the notional, and \f$ I(t) \f$ is the inflation index value at time \f$ t \f$.  \note These instruments have now been changed to follow typical VanillaSwap type design conventions w.r.t. Schedules etc.
          let YearOnYearInflationSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IYearOnYearInflationSwap_Factory > ()
          /// ! \ingroup instruments
          let YoYInflationCap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IYoYInflationCap_Factory > ()
          /// ! \ingroup instruments  Note that the standard YoY inflation cap/floor defined here is different from nominal, because in nominal world standard cap/floors do not have the first optionlet.  This is because they set in advance so there is no point.  However, yoy inflation generally sets (effectively) in arrears, (actually in arrears vs lag of a few months) thus the first optionlet is relevant.  Hence we can do a parity test without a special definition of the YoY cap/floor instrument.  \test - the relationship between the values of caps, floors and the resulting collars is checked. - the put-call parity between the values of caps, floors and swaps is checked. - the correctness of the returned value is tested by checking it against a known good value.
          let YoYInflationCapFloor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IYoYInflationCapFloor_Factory > ()
          /// ! \ingroup instruments
          let YoYInflationCollar = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IYoYInflationCollar_Factory > ()
          /// ! \ingroup instruments
          let YoYInflationFloor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IYoYInflationFloor_Factory > ()
          /// ! Quoted as a fixed rate \f$ K \f$.  At start: \f[ P_n(0,T) N [(1+K)^{T}-1] = P_n(0,T) N \left[ \frac{I(T)}{I(0)} -1 \right] \f] where \f$ T \f$ is the maturity time, \f$ P_n(0,t) \f$ is the nominal discount factor at time \f$ t \f$, \f$ N \f$ is the notional, and \f$ I(t) \f$ is the inflation index value at time \f$ t \f$.  This inherits from swap and has two very simple legs: a fixed leg, from the quote (K); and an indexed leg.  At maturity the two single cashflows are swapped.  These are the notional versus the inflation-indexed notional Because the coupons are zero there are no accruals (and no coupons).  Inflation is generally available on every day, including holidays and weekends.  Hence there is a variable to state whether the observe/fix dates for inflation are adjusted or not.  The default is not to adjust.  A zero inflation swap is a simple enough instrument that the standard discounting pricing engine that works for a vanilla swap also works.  \note we do not need Schedules on the legs because they use one or two dates only per leg.
          let ZeroCouponInflationSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.IZeroCouponInflationSwap_Factory > ()

          module Bonds =
            begin
              /// ! \ingroup instruments
              let BTP = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IBTP_Factory > ()
              /// ! Italian CCTEU (Certificato di credito del tesoro) Euribor6M indexed floating rate bond  \ingroup instruments
              let CCTEU = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.ICCTEU_Factory > ()
              /// ! \ingroup instruments  \test calculations are tested by checking results against cached values.
              let CmsRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.ICmsRateBond_Factory > ()
              /// ! \ingroup instruments
              let CPIBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.ICPIBond_Factory > ()
              /// ! \ingroup instruments  \test calculations are tested by checking results against cached values.
              let FixedRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IFixedRateBond_Factory > ()
              /// ! \ingroup instruments  \test calculations are tested by checking results against cached values.
              let FloatingRateBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IFloatingRateBond_Factory > ()
              /// 
              let RendistatoBasket = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IRendistatoBasket_Factory > ()
              /// 
              let RendistatoCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IRendistatoCalculator_Factory > ()
              /// ! RendistatoCalculator equivalent swap lenth Quote adapter
              let RendistatoEquivalentSwapLengthQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IRendistatoEquivalentSwapLengthQuote_Factory > ()
              /// ! RendistatoCalculator equivalent swap spread Quote adapter
              let RendistatoEquivalentSwapSpreadQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IRendistatoEquivalentSwapSpreadQuote_Factory > ()
              /// ! \ingroup instruments  \test calculations are tested by checking results against cached values.
              let ZeroCouponBond = Cephei.Core.FactoryFinder.Find<Cephei.QL.Instruments.Bonds.IZeroCouponBond_Factory > ()
            end
        end

      module Legacy =
        begin

          module Libormarketmodels =
            begin
              /// ! Brigo, Damiano, Mercurio, Fabio, Morini, Massimo, 2003, Different Covariance  Parameterizations of the Libor Market Model and Joint Caps/Swaptions Calibration (&lt;http://www.exoticderivatives.com/Files/Papers/brigomercuriomorini.pdf&gt;)
              let LfmCovarianceParameterization = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILfmCovarianceParameterization_Factory > ()
              /// ! proxy for a libor forward model covariance parameterization
              let LfmCovarianceProxy = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILfmCovarianceProxy_Factory > ()
              /// ! Hull, John, White, Alan, 1999, Forward Rate Volatilities, Swap Rate Volatilities and the Implementation of the Libor Market Model (<http://www.rotman.utoronto.ca/~amackay/fin/libormktmodel2.pdf>)  \test the correctness is tested by Monte-Carlo reproduction of caplet & ratchet npvs and comparison with Black pricing.
              let LfmHullWhiteParameterization = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILfmHullWhiteParameterization_Factory > ()
              /// ! \ingroup swaptionengines
              let LfmSwaptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILfmSwaptionEngine_Factory > ()
              /// ! References:  Stefan Weber, 2005, Efficient Calibration for Libor Market Models, (<http://workshop.mathfinance.de/2005/papers/weber/slides.pdf>)  Damiano Brigo, Fabio Mercurio, Massimo Morini, 2003, Different Covariance Parameterizations of Libor Market Model and Joint Caps/Swaptions Calibration, (<http://www.business.uts.edu.au/qfrc/conferences/qmf2001/Brigo_D.pdf>  \test the correctness is tested using Monte-Carlo Simulation to reproduce swaption npvs, model calibration and exact cap pricing
              let LiborForwardModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILiborForwardModel_Factory > ()
              /// ! stochastic process of a libor forward model using the rolling forward measure incl. predictor-corrector step  References:  Glasserman, Paul, 2004, Monte Carlo Methods in Financial Engineering, Springer, Section 3.7  Antoon Pelsser, 2000, Efficient Methods for Valuing Interest Rate Derivatives, Springer, 8  Hull, John, White, Alan, 1999, Forward Rate Volatilities, Swap Rate Volatilities and the Implementation of the Libor Market Model (<http://www.rotman.utoronto.ca/~amackay/fin/libormktmodel2.pdf>)  \test the correctness is tested by Monte-Carlo reproduction of caplet & ratchet NPVs and comparison with Black pricing.  \warning this class does not work correctly with Visual C++ 6.  \ingroup processes
              let LiborForwardModelProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILiborForwardModelProcess_Factory > ()
              /// 
              let LmConstWrapperCorrelationModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmConstWrapperCorrelationModel_Factory > ()
              /// ! caplet const volatility model
              let LmConstWrapperVolatilityModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmConstWrapperVolatilityModel_Factory > ()
              /// ! %libor forward correlation model
              let LmCorrelationModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmCorrelationModel_Factory > ()
              /// ! This class describes a exponential correlation model  \f[ \rho_{i,j}=e^{(-\beta \|i-j\|)} \f]  References:  Damiano Brigo, Fabio Mercurio, Massimo Morini, 2003, Different Covariance Parameterizations of Libor Market Model and Joint Caps/Swaptions Calibration, (<http://www.business.uts.edu.au/qfrc/conferences/qmf2001/Brigo_D.pdf>)
              let LmExponentialCorrelationModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmExponentialCorrelationModel_Factory > ()
              /// ! This class describes an extended linear-exponential volatility model  \f[ \sigma_i(t)=k_i*((a*(T_{i}-t)+d)*e^{-b(T_{i}-t)}+c) \f]  References:  Damiano Brigo, Fabio Mercurio, Massimo Morini, 2003, Different Covariance Parameterizations of Libor Market Model and Joint Caps/Swaptions Calibration, (<http://www.business.uts.edu.au/qfrc/conferences/qmf2001/Brigo_D.pdf>)
              let LmExtLinearExponentialVolModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmExtLinearExponentialVolModel_Factory > ()
              /// 
              let LmFixedVolatilityModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmFixedVolatilityModel_Factory > ()
              /// ! This class describes a exponential correlation model  \f[ \rho_{i,j}=rho + (1-rho)*e^{(-\beta \|i-j\|)} \f]  References:  Damiano Brigo, Fabio Mercurio, Massimo Morini, 2003, Different Covariance Parameterizations of Libor Market Model and Joint Caps/Swaptions Calibration, (<http://www.business.uts.edu.au/qfrc/conferences/qmf2001/Brigo_D.pdf>)
              let LmLinearExponentialCorrelationModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmLinearExponentialCorrelationModel_Factory > ()
              /// ! This class describes a linear-exponential volatility model  \f[ \sigma_i(t)=(a*(T_{i}-t)+d)*e^{-b(T_{i}-t)}+c \f]  References:  Damiano Brigo, Fabio Mercurio, Massimo Morini, 2003, Different Covariance Parameterizations of Libor Market Model and Joint Caps/Swaptions Calibration, (<http://www.business.uts.edu.au/qfrc/conferences/qmf2001/Brigo_D.pdf>)
              let LmLinearExponentialVolatilityModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmLinearExponentialVolatilityModel_Factory > ()
              /// ! caplet volatility model
              let LmVolatilityModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Legacy.Libormarketmodels.ILmVolatilityModel_Factory > ()
            end

          module Pricers =
            begin
            end

          module Termstructures =
            begin
            end
        end

      module Math =
        begin
          /// ! This class implements the concept of vector as used in linear algebra. As such, it is <b>not</b> meant to be used as a container - <tt>std::vector</tt> should be used instead.  \test construction of arrays is checked in a number of cases
          let Array = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IArray_Factory > ()
          /// ! see definition:  Weisstein, Eric W. "Bernstein Polynomial." From MathWorld--A Wolfram Web Resource. <http://mathworld.wolfram.com/BernsteinPolynomial.html>  The Bernstein polynomials \f$  B_{i,n}(x) \f$ are defined as  \f[ B_{i,n}(x) \equiv \left( \begin{array}{c} n \\ i \end{array} \right) x^i (1-x)^{n-i} \f]
          let BernsteinPolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IBernsteinPolynomial_Factory > ()
          /// 
          let BoundedDomain = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IBoundedDomain_Factory > ()
          /// ! Follows treatment and notation from:  Weisstein, Eric W. "B-Spline." From MathWorld--A Wolfram Web Resource.  <http://mathworld.wolfram.com/B-Spline.html>  \f$ (p+1) \f$-th order B-spline (or p degree polynomial) basis functions \f$ N_{i,p}(x), i = 0,1,2 \ldots n \f$, with \f$ n+1 \f$ control points, or equivalently, an associated knot vector of size \f$ p+n+2 \f$ defined at the increasingly sorted points \f$ (x_0, x_1 \ldots x_{n+p+1}) \f$. A linear B-spline has \f$ p=1 \f$, quadratic B-spline has \f$ p=2 \f$, a cubic B-spline has \f$ p=3 \f$, etc.  The B-spline basis functions are defined recursively as follows:  \f[ \begin{array}{rcl} N_{i,0}(x) &=& 1   \textrm{\ if\ } x_{i} \leq x < x_{i+1} \\ &=& 0   \textrm{\ otherwise} \\ N_{i,p}(x) &=& N_{i,p-1}(x) \frac{(x - x_{i})}{ (x_{i+p-1} - x_{i})} + N_{i+1,p-1}(x) \frac{(x_{i+p} - x)}{(x_{i+p} - x_{i+1})} \end{array} \f]
          let BSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IBSpline_Factory > ()
          /// ! Ceiling truncation.
          let CeilingTruncation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ICeilingTruncation_Factory > ()
          /// ! Closest rounding.
          let ClosestRounding = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IClosestRounding_Factory > ()
          /// ! abstract curve class
          let Curve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ICurve_Factory > ()
          /// ! %domain abstract lcass
          let Domain = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IDomain_Factory > ()
          /// ! Down-rounding.
          let DownRounding = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IDownRounding_Factory > ()
          /// ! formula here ... Used to calculate the cumulative normal distribution function
          let ErrorFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IErrorFunction_Factory > ()
          /// predicates
          let everywhere = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Ieverywhere_Factory > ()
          /// ! \test the correctness of the returned value is tested by checking it against numerical calculations.
          let Factorial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IFactorial_Factory > ()
          /// ! %Floor truncation.
          let FloorTruncation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IFloorTruncation_Factory > ()
          /// ! Gaussian kernel function
          let GaussianKernel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IGaussianKernel_Factory > ()
          /// ! References: "Numerical Recipes in C", 2nd edition, Press, Teukolsky, Vetterling, Flannery,  \test the correctness of the returned values is tested by checking their properties.
          let GeneralLinearLeastSquares = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IGeneralLinearLeastSquares_Factory > ()
          /// ! Classes derived from this class will provide interpolated values from two sequences of equal length, representing discretized values of a variable and a function of the former, respectively.
          let Interpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IInterpolation_Factory > ()
          /// ! Kernel function in the statistical sense, e.g. a nonnegative, real-valued function which integrates to one and is symmetric.  Derived classes will serve as functors.
          let KernelFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IKernelFunction_Factory > ()
          /// ! linear regression y_i = a_0 + a_1*x_0 +..+a_n*x_{n-1} + eps
          let LinearRegression = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ILinearRegression_Factory > ()
          /// 
          let LogGrid = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ILogGrid_Factory > ()
          /// ! This class implements the concept of Matrix as used in linear algebra. As such, it is <b>not</b> meant to be used as a container.
          let Matrix = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IMatrix_Factory > ()
          /// 
          let nowhere = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Inowhere_Factory > ()
          /// 
          let NullDomain = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.INullDomain_Factory > ()
          /// ! Taken from "Monte Carlo Methods in Finance", by Peter J?ckel
          let PrimeNumbers = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IPrimeNumbers_Factory > ()
          /// 
          let quadratic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Iquadratic_Factory > ()
          /// 
          let RectangularDomain = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IRectangularDomain_Factory > ()
          /// ! \test the correctness of the returned values is tested by checking them against known good results.
          let Rounding = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IRounding_Factory > ()
          /// ! Initially the class will contain one indexed curve
          let SampledCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ISampledCurve_Factory > ()
          /// ! %Surface abstract class @todo: Interface this with STL binary function template
          let Surface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ISurface_Factory > ()
          /// 
          let TestCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ITestCurve_Factory > ()
          /// 
          let TestSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ITestSurface_Factory > ()
          /// ! This package encapuslates an array of grid points.  It is used primarily in PDE calculations.
          let TransformedGrid = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.ITransformedGrid_Factory > ()
          /// 
          let UniversalDomain = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IUniversalDomain_Factory > ()
          /// ! Up-rounding.
          let UpRounding = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.IUpRounding_Factory > ()

          module Copulas =
            begin
              /// ! Ali-Mikhail-Haq copula
              let AliMikhailHaqCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IAliMikhailHaqCopula_Factory > ()
              /// ! Clayton copula
              let ClaytonCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IClaytonCopula_Factory > ()
              /// ! Farlie-Gumbel-Morgenstern copula
              let FarlieGumbelMorgensternCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IFarlieGumbelMorgensternCopula_Factory > ()
              /// ! Frank copula
              let FrankCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IFrankCopula_Factory > ()
              /// ! Galambos copula
              let GalambosCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IGalambosCopula_Factory > ()
              /// ! Gaussian copula
              let GaussianCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IGaussianCopula_Factory > ()
              /// ! Gumbel copula
              let GumbelCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IGumbelCopula_Factory > ()
              /// ! Husler-Reiss copula
              let HuslerReissCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IHuslerReissCopula_Factory > ()
              /// ! independent copula
              let IndependentCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IIndependentCopula_Factory > ()
              /// ! Marshall-Olkin copula
              let MarshallOlkinCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IMarshallOlkinCopula_Factory > ()
              /// ! max copula
              let MaxCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IMaxCopula_Factory > ()
              /// ! min copula
              let MinCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IMinCopula_Factory > ()
              /// ! Plackett copula
              let PlackettCopula = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Copulas.IPlackettCopula_Factory > ()
            end

          module Distributions =
            begin
              /// ! formula here ... Given an integer k it returns its probability in a Binomial distribution with parameters p and n.
              let BinomialDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IBinomialDistribution_Factory > ()
              /// ! Drezner (1978) algorithm, six decimal places accuracy.  For this implementation see "Option pricing formulas", E.G. Haug, McGraw-Hill 1998  \todo check accuracy of this algorithm and compare with: 1) Drezner, Z, (1978), Computation of the bivariate normal integral, Mathematics of Computation 32, pp. 277-279. 2) Drezner, Z. and Wesolowsky, G. O. (1990) `On the Computation of the Bivariate Normal Integral', Journal of Statistical Computation and Simulation 35, pp. 101-107. 3) Drezner, Z (1992) Computation of the Multivariate Normal Integral, ACM Transactions on Mathematics Software 18, pp. 450-460. 4) Drezner, Z (1994) Computation of the Trivariate Normal Integral, Mathematics of Computation 62, pp. 289-294. 5) Genz, A. (1992) `Numerical Computation of the Multivariate Normal Probabilities', J. Comput. Graph. Stat. 1, pp. 141-150.  \test the correctness of the returned value is tested by checking it against known good results.
              let BivariateCumulativeNormalDistributionDr78 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IBivariateCumulativeNormalDistributionDr78_Factory > ()
              /// ! The implementation derives from the article "Better Approximations To Cumulative Normal Distibutions", Graeme West, Dec 2004 available at www.finmod.co.za. Also available in Wilmott Magazine, 2005, (May), 70-76, The main code is a port of the C++ code at www.finmod.co.za/cumfunctions.zip.  The algorithm is based on the near double-precision algorithm described in "Numerical Computation of Rectangular Bivariate an Trivariate Normal and t Probabilities", Genz (2004), Statistics and Computing 14, 151-160. (available at www.sci.wsu.edu/math/faculty/henz/homepage)  The QuantLib implementation mainly differs from the original code in two regards; - The implementation of the cumulative normal distribution is QuantLib::CumulativeNormalDistribution - The arrays XX and W are zero-based  \test the correctness of the returned value is tested by checking it against known good results.
              let BivariateCumulativeNormalDistributionWe04DP = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IBivariateCumulativeNormalDistributionWe04DP_Factory > ()
              /// 
              let ChiSquareDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IChiSquareDistribution_Factory > ()
              /// ! Given an integer k it provides the cumulative probability of observing kk<=k: formula here ...
              let CumulativeBinomialDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.ICumulativeBinomialDistribution_Factory > ()
              /// ! Given x it provides an approximation to the integral of the gaussian normal distribution: formula here ...  For this implementation see M. Abramowitz and I. Stegun, Handbook of Mathematical Functions, Dover Publications, New York (1972)
              let CumulativeNormalDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.ICumulativeNormalDistribution_Factory > ()
              /// ! This function provides an approximation of the integral of the Poisson distribution.  For this implementation see "Numerical Recipes in C", 2nd edition, Press, Teukolsky, Vetterling, Flannery, chapter 6  \test the correctness of the returned value is tested by checking it against known good results.
              let CumulativePoissonDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.ICumulativePoissonDistribution_Factory > ()
              /// ! Cumulative distribution function for \f$ n \f$ degrees of freedom (see mathworld.wolfram.com): \f[ F(x) = \int_{-\infty}^x\,f(y)\,dy = \frac{1}{2}\, +\,\frac{1}{2}\,sgn(x)\, \left[ I\left(1,\frac{n}{2},\frac{1}{2}\right) - I\left(\frac{n}{n+y^2}, \frac{n}{2},\frac{1}{2}\right)\right] \f] where \f$ I(z; a, b) \f$ is the regularized incomplete beta function.
              let CumulativeStudentDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.ICumulativeStudentDistribution_Factory > ()
              /// 
              let GammaDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IGammaDistribution_Factory > ()
              /// ! This is a function defined by \f[ \Gamma(z) = \int_0^{\infty}t^{z-1}e^{-t}dt \f]  The implementation of the algorithm was inspired by "Numerical Recipes in C", 2nd edition, Press, Teukolsky, Vetterling, Flannery, chapter 6  \test the correctness of the returned value is tested by checking it against known good results.
              let GammaFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IGammaFunction_Factory > ()
              /// ! Given x between zero and one as the integral value of a gaussian normal distribution this class provides the value y such that formula here ...  It use Acklam's approximation: by Peter J. Acklam, University of Oslo, Statistics Division. URL: http://home.online.no/~pjacklam/notes/invnorm/index.html  This class can also be used to generate a gaussian normal distribution from a uniform distribution. This is especially useful when a gaussian normal distribution is generated from a low discrepancy uniform distribution: in this case the traditional Box-Muller approach and its variants would not preserve the sequence's low-discrepancy.
              let InverseCumulativeNormal = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IInverseCumulativeNormal_Factory > ()
              /// ! \test the correctness of the returned value is tested by checking it against known good results.
              let InverseCumulativePoisson = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IInverseCumulativePoisson_Factory > ()
              /// ! \todo Find/implement an efficient algorithm for evaluating the cumulative Student t-distribution, replacing the Newton iteration
              let InverseCumulativeStudent = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IInverseCumulativeStudent_Factory > ()
              /// 
              let InverseNonCentralChiSquareDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IInverseNonCentralChiSquareDistribution_Factory > ()
              /// ! Given x between zero and one as the integral value of a gaussian normal distribution this class provides the value y such that formula here ...  It uses Beasly and Springer approximation, with an improved approximation for the tails. See Boris Moro, "The Full Monte", 1995, Risk Magazine.  This class can also be used to generate a gaussian normal distribution from a uniform distribution. This is especially useful when a gaussian normal distribution is generated from a low discrepancy uniform distribution: in this case the traditional Box-Muller approach and its variants would not preserve the sequence's low-discrepancy.  Peter J. Acklam's approximation is better and is available as QuantLib::InverseCumulativeNormal
              let MoroInverseCumulativeNormal = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IMoroInverseCumulativeNormal_Factory > ()
              /// 
              let NonCentralChiSquareDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.INonCentralChiSquareDistribution_Factory > ()
              /// ! Given x, it returns its probability in a Gaussian normal distribution. It provides the first derivative too.  \test the correctness of the returned value is tested by checking it against numerical calculations. Cross-checks are also performed against the CumulativeNormalDistribution and InverseCumulativeNormal classes.
              let NormalDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.INormalDistribution_Factory > ()
              /// ! Given an integer \f$ k \f$, it returns its probability in a Poisson distribution.  \test the correctness of the returned value is tested by checking it against known good results.
              let PoissonDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IPoissonDistribution_Factory > ()
              /// ! Probability density function for \f$ n \f$ degrees of freedom (see mathworld.wolfram.com or wikipedia.org): \f[ f(x) = \frac {\Gamma\left(\frac{n+1}{2}\right)} {\sqrt{n\pi} \, \Gamma\left(\frac{n}{2}\right)}\: \frac {1} {\left(1+\frac{x^2}{n}\right)^{(n+1)/2}} \f]
              let StudentDistribution = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Distributions.IStudentDistribution_Factory > ()
            end

          module Integrals =
            begin
              /// ! This class performs a 1-dimensional Gauss-Chebyshev integration. \f[ \int_{-1}^{1} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x)=(1-x^2)^{1/2} \f]
              let GaussChebyshev2ndIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussChebyshev2ndIntegration_Factory > ()
              /// ! Gauss-Chebyshev polynomial (second kind)
              let GaussChebyshev2ndPolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussChebyshev2ndPolynomial_Factory > ()
              /// ! This class performs a 1-dimensional Gauss-Chebyshev integration. \f[ \int_{-1}^{1} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x)=(1-x^2)^{-1/2} \f]
              let GaussChebyshevIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussChebyshevIntegration_Factory > ()
              /// ! Gauss-Chebyshev polynomial
              let GaussChebyshevPolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussChebyshevPolynomial_Factory > ()
              /// ! This class performs a 1-dimensional Gauss-Gegenbauer integration. \f[ \int_{-1}^{1} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x)=(1-x^2)^{\lambda-1/2} \f]
              let GaussGegenbauerIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussGegenbauerIntegration_Factory > ()
              /// ! Gauss-Gegenbauer polynomial
              let GaussGegenbauerPolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussGegenbauerPolynomial_Factory > ()
              /// ! This class performs a 1-dimensional Gauss-Hermite integration. \f[ \int_{-\inf}^{\inf} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x;\mu)=|x|^{2\mu} \exp{-x*x} \f] and \f[ \mu > -0.5 \f]
              let GaussHermiteIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussHermiteIntegration_Factory > ()
              /// ! Gauss-Hermite polynomial
              let GaussHermitePolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussHermitePolynomial_Factory > ()
              /// ! This class performs a 1-dimensional Gauss-Hyperbolic integration. \f[ \int_{-\inf}^{\inf} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x)=1/cosh(x) \f]
              let GaussHyperbolicIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussHyperbolicIntegration_Factory > ()
              /// ! Gauss hyperbolic polynomial
              let GaussHyperbolicPolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussHyperbolicPolynomial_Factory > ()
              /// ! References: Gauss quadratures and orthogonal polynomials  G.H. Gloub and J.H. Welsch: Calculation of Gauss quadrature rule. Math. Comput. 23 (1986), 221-230  "Numerical Recipes in C", 2nd edition, Press, Teukolsky, Vetterling, Flannery,  The polynomials are defined by the three-term recurrence relation \f[ P_{k+1}(x)=(x-\alpha_k) P_k(x) - \beta_k P_{k-1}(x) \f] and \f[ \mu_0 = \int{w(x)dx} \f]
              let GaussianOrthogonalPolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussianOrthogonalPolynomial_Factory > ()
              /// ! References: Gauss quadratures and orthogonal polynomials  G.H. Gloub and J.H. Welsch: Calculation of Gauss quadrature rule. Math. Comput. 23 (1986), 221-230  "Numerical Recipes in C", 2nd edition, Press, Teukolsky, Vetterling, Flannery,  \test the correctness of the result is tested by checking it against known good values.
              let GaussianQuadrature = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussianQuadrature_Factory > ()
              /// ! This class performs a 1-dimensional Gauss-Jacobi integration. \f[ \int_{-1}^{1} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x;\alpha,\beta)=(1-x)^\alpha (1+x)^\beta \f]
              let GaussJacobiIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussJacobiIntegration_Factory > ()
              /// ! Gauss-Jacobi polynomial
              let GaussJacobiPolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussJacobiPolynomial_Factory > ()
              /// ! This class provide an adaptive integration procedure using 15 points Gauss-Kronrod integration rule.  This is more robust in that it allows to integrate less smooth functions (though singular functions should be integrated using dedicated algorithms) but less efficient beacuse it does not reuse precedently computed points during computation steps.  References:  Gauss-Kronrod Integration <http://mathcssun1.emporia.edu/~oneilcat/ExperimentApplet3/ExperimentApplet3.html>  NMS - Numerical Analysis Library <http://www.math.iastate.edu/burkardt/f_src/nms/nms.html>  \test the correctness of the result is tested by checking it against known good values.
              let GaussKronrodAdaptive = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussKronrodAdaptive_Factory > ()
              /// ! This class provide a non-adaptive integration procedure which uses fixed Gauss-Kronrod abscissae to sample the integrand at a maximum of 87 points.  It is provided for fast integration of smooth functions.  This function applies the Gauss-Kronrod 10-point, 21-point, 43-point and 87-point integration rules in succession until an estimate of the integral of f over (a, b) is achieved within the desired absolute and relative error limits, epsabs and epsrel. The function returns the final approximation, result, an estimate of the absolute error, abserr and the number of function evaluations used, neval. The Gauss-Kronrod rules are designed in such a way that each rule uses all the results of its predecessors, in order to minimize the total number of function evaluations.
              let GaussKronrodNonAdaptive = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussKronrodNonAdaptive_Factory > ()
              /// ! This class performs a 1-dimensional Gauss-Laguerre integration. \f[ \int_{0}^{\inf} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x;s)=x^s \exp{-x} \f] and \f[ s > -1 \f]
              let GaussLaguerreIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussLaguerreIntegration_Factory > ()
              /// ! Gauss-Laguerre polynomial
              let GaussLaguerrePolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussLaguerrePolynomial_Factory > ()
              /// ! This class performs a 1-dimensional Gauss-Legendre integration. \f[ \int_{-1}^{1} f(x) \mathrm{d}x \f] The weighting function is \f[ w(x)=1 \f]
              let GaussLegendreIntegration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussLegendreIntegration_Factory > ()
              /// ! Gauss-Legendre polynomial
              let GaussLegendrePolynomial = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussLegendrePolynomial_Factory > ()
              /// ! References: This algorithm is a C++ implementation of the algorithm outlined in  W. Gander and W. Gautschi, Adaptive Quadrature - Revisited. BIT, 40(1):84-101, March 2000. CS technical report: ftp.inf.ethz.ch/pub/publications/tech-reports/3xx/306.ps.gz  The original MATLAB version can be downloaded here http://www.inf.ethz.ch/personal/gander/adaptlob.m
              let GaussLobattoIntegral = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IGaussLobattoIntegral_Factory > ()
              /// 
              let Integrator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.IIntegrator_Factory > ()
              /// ! Given a number \f$ N \f$ of intervals, the integral of a function \f$ f \f$ between \f$ a \f$ and \f$ b \f$ is calculated by means of the trapezoid formula \f[ \int_{a}^{b} f \mathrm{d}x = \frac{1}{2} f(x_{0}) + f(x_{1}) + f(x_{2}) + \dots + f(x_{N-1}) + \frac{1}{2} f(x_{N}) \f] where \f$ x_0 = a \f$, \f$ x_N = b \f$, and \f$ x_i = a+i \Delta x \f$ with \f$ \Delta x = (b-a)/N \f$.  \test the correctness of the result is tested by checking it against known good values.
              let SegmentIntegral = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.ISegmentIntegral_Factory > ()
              /// ! \test the correctness of the result is tested by checking it against known good values.
              let SimpsonIntegral = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.ISimpsonIntegral_Factory > ()
              /// ! tabulated Gauss-Legendre quadratures
              let TabulatedGaussLegendre = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Integrals.ITabulatedGaussLegendre_Factory > ()
            end

          module Interpolations =
            begin
              /// ! %Abcd interpolation factory and traits
              let Abcd = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IAbcd_Factory > ()
              /// ! %Abcd interpolation between discrete points.
              let AbcdInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IAbcdInterpolation_Factory > ()
              /// 
              let AkimaCubicInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IAkimaCubicInterpolation_Factory > ()
              /// ! Backward-flat interpolation factory and traits
              let BackwardFlat = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IBackwardFlat_Factory > ()
              /// ! Backward-flat interpolation between discrete points
              let BackwardFlatInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IBackwardFlatInterpolation_Factory > ()
              /// ! bicubic-spline-interpolation factory
              let Bicubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IBicubic_Factory > ()
              /// ! \todo revise end conditions
              let BicubicSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IBicubicSpline_Factory > ()
              /// ! bilinear-interpolation factory
              let Bilinear = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IBilinear_Factory > ()
              /// ! %bilinear interpolation between discrete points
              let BilinearInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IBilinearInterpolation_Factory > ()
              /// ! Convex-monotone interpolation factory and traits
              let ConvexMonotone = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IConvexMonotone_Factory > ()
              /// ! %Cubic interpolation factory and traits
              let Cubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ICubic_Factory > ()
              /// ! Cubic interpolation is fully defined when the ${f_i}$ function values at points ${x_i}$ are supplemented with ${f^'_i}$ function derivative values.  Different type of first derivative approximations are implemented, both local and non-local. Local schemes (Fourth-order, Parabolic, Modified Parabolic, Fritsch-Butland, Akima, Kruger) use only $f$ values near $x_i$ to calculate each $f^'_i$. Non-local schemes (Spline with different boundary conditions) use all ${f_i}$ values and obtain ${f^'_i}$ by solving a linear system of equations. Local schemes produce $C^1$ interpolants, while the spline schemes generate $C^2$ interpolants.  Hyman's monotonicity constraint filter is also implemented: it can be applied to all schemes to ensure that in the regions of local monotoniticity of the input (three successive increasing or decreasing values) the interpolating cubic remains monotonic. If the interpolating cubic is already monotonic, the Hyman filter leaves it unchanged preserving all its original features.  In the case of $C^2$ interpolants the Hyman filter ensures local monotonicity at the expense of the second derivative of the interpolant which will no longer be continuous in the points where the filter has been applied.  While some non-linear schemes (Modified Parabolic, Fritsch-Butland, Kruger) are guaranteed to be locally monotonic in their original approximation, all other schemes must be filtered according to the Hyman criteria at the expense of their linearity.  See R. L. Dougherty, A. Edelman, and J. M. Hyman, "Nonnegativity-, Monotonicity-, or Convexity-Preserving CubicSpline and Quintic Hermite Interpolation" Mathematics Of Computation, v. 52, n. 186, April 1989, pp. 471-494.  \todo implement missing schemes (FourthOrder and ModifiedParabolic) and missing boundary conditions (Periodic and Lagrange).  \test to be adapted from old ones.
              let CubicInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ICubicInterpolation_Factory > ()
              /// convenience classes
              let CubicNaturalSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ICubicNaturalSpline_Factory > ()
              /// 
              let CubicSplineOvershootingMinimization1 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ICubicSplineOvershootingMinimization1_Factory > ()
              /// 
              let CubicSplineOvershootingMinimization2 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ICubicSplineOvershootingMinimization2_Factory > ()
              /// ! base class for classes possibly allowing extrapolation
              let Extrapolator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IExtrapolator_Factory > ()
              /// 
              let FlatExtrapolator2D = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IFlatExtrapolator2D_Factory > ()
              /// ! Forward-flat interpolation factory and traits
              let ForwardFlat = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IForwardFlat_Factory > ()
              /// ! Forward-flat interpolation between discrete points
              let ForwardFlatInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IForwardFlatInterpolation_Factory > ()
              /// 
              let FritschButlandCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IFritschButlandCubic_Factory > ()
              /// 
              let FritschButlandLogCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IFritschButlandLogCubic_Factory > ()
              /// ! Classes derived from this class will provide interpolated values from two sequences of length \f$ N \f$ and \f$ M \f$, representing the discretized values of the \f$ x \f$ and \f$ y \f$ variables, and a \f$ N \times M \f$ matrix representing the tabulated function values.
              let Interpolation2D = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IInterpolation2D_Factory > ()
              /// ! Implementation of the kernel interpolation approach, which can be found in "Foreign Exchange Risk" by Hakala, Wystup page 256.  The kernel in the implementation is kept general, although a Gaussian is considered in the cited text.
              let KernelInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IKernelInterpolation_Factory > ()
              /// ! Implementation of the 2D kernel interpolation approach, which can be found in "Foreign Exchange Risk" by Hakala, Wystup page 256.  The kernel in the implementation is kept general, although a Gaussian is considered in the cited text.
              let KernelInterpolation2D = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IKernelInterpolation2D_Factory > ()
              /// 
              let KrugerCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IKrugerCubic_Factory > ()
              /// 
              let KrugerLogCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IKrugerLogCubic_Factory > ()
              /// ! %Linear-interpolation factory and traits
              let Linear = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILinear_Factory > ()
              /// ! %Linear interpolation between discrete points
              let LinearInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILinearInterpolation_Factory > ()
              /// ! log-cubic interpolation factory and traits
              let LogCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILogCubic_Factory > ()
              /// ! %log-cubic interpolation between discrete points
              let LogCubicInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILogCubicInterpolation_Factory > ()
              /// convenience classes
              let LogCubicNaturalSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILogCubicNaturalSpline_Factory > ()
              /// ! log-linear interpolation factory and traits
              let LogLinear = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILogLinear_Factory > ()
              /// ! %log-linear interpolation between discrete points
              let LogLinearInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILogLinearInterpolation_Factory > ()
              /// 
              let LogParabolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ILogParabolic_Factory > ()
              /// ! mixed linear/cubic interpolation factory and traits
              let MixedLinearCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearCubic_Factory > ()
              /// ! mixed linear/cubic interpolation between discrete points
              let MixedLinearCubicInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearCubicInterpolation_Factory > ()
              /// convenience classes
              let MixedLinearCubicNaturalSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearCubicNaturalSpline_Factory > ()
              /// 
              let MixedLinearFritschButlandCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearFritschButlandCubic_Factory > ()
              /// 
              let MixedLinearKrugerCubic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearKrugerCubic_Factory > ()
              /// 
              let MixedLinearMonotonicCubicNaturalSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearMonotonicCubicNaturalSpline_Factory > ()
              /// 
              let MixedLinearMonotonicParabolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearMonotonicParabolic_Factory > ()
              /// 
              let MixedLinearParabolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMixedLinearParabolic_Factory > ()
              /// 
              let MonotonicCubicNaturalSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMonotonicCubicNaturalSpline_Factory > ()
              /// 
              let MonotonicLogCubicNaturalSpline = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMonotonicLogCubicNaturalSpline_Factory > ()
              /// 
              let MonotonicLogParabolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMonotonicLogParabolic_Factory > ()
              /// 
              let MonotonicParabolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IMonotonicParabolic_Factory > ()
              /// 
              let Parabolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.IParabolic_Factory > ()
              /// ! %SABR interpolation factory and traits
              let SABR = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ISABR_Factory > ()
              /// ! %SABR smile interpolation between discrete volatility points.
              let SABRInterpolation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Interpolations.ISABRInterpolation_Factory > ()
            end

          module Matrixutilities =
            begin
              /// 
              let BasisIncompleteOrdered = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.IBasisIncompleteOrdered_Factory > ()
              /// 
              let BiCGstab = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.IBiCGstab_Factory > ()
              /// 
              let BiCGStabResult = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.IBiCGStabResult_Factory > ()
              /// ! Extracts the correlation matrix and the vector of variances out of the input covariance matrix.  Note that only the lower symmetric part of the covariance matrix is used.  \pre The covariance matrix must be symmetric.  \test cross checked with getCovariance
              let CovarianceDecomposition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.ICovarianceDecomposition_Factory > ()
              /// ! Given a collection of vectors, w_i, find a collection of vectors x_i such that x_i is orthogonal to w_j for i != j, and <x_i, w_i> = <w_i, w_i>  This is done by performing GramSchmidt on the other vectors and then projecting onto the orthogonal space.  This class is tested in  MatricesTest::testOrthogonalProjection();
              let OrthogonalProjections = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.IOrthogonalProjections_Factory > ()
              /// ! algorithm used for matricial pseudo square root
              let SalvagingAlgorithm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.ISalvagingAlgorithm_Factory > ()
              /// ! References:  Saad, Yousef. 1996, Iterative methods for sparse linear systems, http://www-users.cs.umn.edu/~saad/books.html
              let SparseILUPreconditioner = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.ISparseILUPreconditioner_Factory > ()
              /// ! Refer to Golub and Van Loan: Matrix computation, The Johns Hopkins University Press  \test the correctness of the returned values is tested by checking their properties.
              let SVD = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.ISVD_Factory > ()
              /// ! Given a real symmetric matrix S, the Schur decomposition finds the eigenvalues and eigenvectors of S. If D is the diagonal matrix formed by the eigenvalues and U the unitarian matrix of the eigenvectors we can write the Schur decomposition as \f[ S = U \cdot D \cdot U^T \, ,\f] where \f$ \cdot \f$ is the standard matrix product and  \f$ ^T  \f$ is the transpose operator. This class implements the Schur decomposition using the symmetric threshold Jacobi algorithm. For details on the different Jacobi transfomations see "Matrix computation," second edition, by Golub and Van Loan, The Johns Hopkins University Press  \test the correctness of the returned values is tested by checking their properties.
              let SymmetricSchurDecomposition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.ISymmetricSchurDecomposition_Factory > ()
              /// ! References:  Wilkinson, J.H. and Reinsch, C. 1971, Linear Algebra, vol. II of Handbook for Automatic Computation (New York: Springer-Verlag)  "Numerical Recipes in C", 2nd edition, Press, Teukolsky, Vetterling, Flannery,  \test the correctness of the result is tested by checking it against known good values.
              let TqrEigenDecomposition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Matrixutilities.ITqrEigenDecomposition_Factory > ()
            end

          module Optimization =
            begin
              /// ! Let \f$ \alpha \f$ and \f$ \beta \f$ be 2 scalars in \f$ [0,1] \f$.  Let \f$ x \f$ be the current value of the unknown, \f$ d \f$ the search direction and \f$ t \f$ the step. Let \f$ f \f$ be the function to minimize.  The line search stops when \f$ t \f$ verifies \f[ f(x + t \cdot d) - f(x) \leq -\alpha t f'(x+t \cdot d) \f] and \f[ f(x+\frac{t}{\beta} \cdot d) - f(x) > -\frac{\alpha}{\beta} t f'(x+t \cdot d) \f]  (see Polak, Algorithms and consistent approximations, Optimization, volume 124 of Applied Mathematical Sciences, Springer-Verlag, NY, 1997)
              let ArmijoLineSearch = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IArmijoLineSearch_Factory > ()
              /// ! See <http://en.wikipedia.org/wiki/BFGS_method>.  Adapted from Numerical Recipes in C, 2nd edition.  User has to provide line-search method and optimization end criteria.
              let BFGS = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IBFGS_Factory > ()
              /// ! %Constraint imposing all arguments to be in [low,high]
              let BoundaryConstraint = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IBoundaryConstraint_Factory > ()
              /// ! %Constraint enforcing both given sub-constraints
              let CompositeConstraint = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ICompositeConstraint_Factory > ()
              /// ! Fletcher-Reeves-Polak-Ribiere algorithm adapted from Numerical Recipes in C, 2nd edition.  User has to provide line-search method and optimization end criteria. Search direction \f$ d_i = - f'(x_i) + c_i*d_{i-1} \f$ where \f$ c_i = ||f'(x_i)||^2/||f'(x_{i-1})||^2 \f$ and \f$ d_1 = - f'(x_1) \f$
              let ConjugateGradient = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IConjugateGradient_Factory > ()
              /// ! Base constraint class
              let Constraint = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IConstraint_Factory > ()
              /// !  Cost function abstract class for optimization problem
              let CostFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ICostFunction_Factory > ()
              /// ! - maximum number of iterations AND minimum number of iterations around stationary point - x (independent variable) stationary point - y=f(x) (dependent variable) stationary point - stationary gradient
              let EndCriteria = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IEndCriteria_Factory > ()
              /// ! Implements a cost function using the interface provided by the LeastSquareProblem class.
              let LeastSquareFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ILeastSquareFunction_Factory > ()
              /// ! Base class for least square problem
              let LeastSquareProblem = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ILeastSquareProblem_Factory > ()
              /// ! This implementation is based on MINPACK (<http://www.netlib.org/minpack>, <http://www.netlib.org/cephes/linalg.tgz>)
              let LevenbergMarquardt = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ILevenbergMarquardt_Factory > ()
              /// ! Base class for line search
              let LineSearch = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ILineSearch_Factory > ()
              /// 
              let LineSearchBasedMethod = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ILineSearchBasedMethod_Factory > ()
              /// ! No constraint
              let NoConstraint = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.INoConstraint_Factory > ()
              /// ! Using a given optimization algorithm (default is conjugate gradient),  \f[ min \{ r(x) : x in R^n \} \f]  where \f$ r(x) = |f(x)|^2 \f$ is the Euclidean norm of \f$ f(x) \f$ for some vector-valued function \f$ f \f$ from \f$ R^n \f$ to \f$ R^m \f$, \f[ f = (f_1, ..., f_m) \f] with \f$ f_i(x) = b_i - \phi(x,t_i) \f$ where \f$ b \f$ is the vector of target data and \f$ phi \f$ is a scalar function.  Assuming the differentiability of \f$ f \f$, the gradient of \f$ r \f$ is defined by \f[ grad r(x) = f'(x)^t.f(x) \f]
              let NonLinearLeastSquare = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.INonLinearLeastSquare_Factory > ()
              /// ! Abstract class for constrained optimization method
              let OptimizationMethod = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IOptimizationMethod_Factory > ()
              /// 
              let ParametersTransformation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IParametersTransformation_Factory > ()
              /// ! %Constraint imposing positivity to all arguments
              let PositiveConstraint = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IPositiveConstraint_Factory > ()
              /// ! \warning The passed CostFunction and Constraint instances are stored by reference.  The user of this class must make sure that they are not destroyed before the Problem instance.
              let Problem = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IProblem_Factory > ()
              /// ! This class creates a proxy cost function which can depend on any arbitrary subset of parameters (the other being fixed)
              let ProjectedCostFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.IProjectedCostFunction_Factory > ()
              /// ! Multi-dimensional simplex class
              let Simplex = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ISimplex_Factory > ()
              /// ! - we are in r^3 sphere centred at O radius r - vertical cylinder centred at (alpha,0) radius s - Z some point in R3 - find point on intersection that is closest to Z  the intersection may be empty!
              let SphereCylinderOptimizer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ISphereCylinderOptimizer_Factory > ()
              /// ! User has to provide line-search method and optimization end criteria  search direction \f$ = - f'(x) \f$
              let SteepestDescent = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Optimization.ISteepestDescent_Factory > ()
            end

          module Randomnumbers =
            begin
              /// ! It is based on existing Fortran and C algorithms to calculate pascal matrix and gray transforms. -# E. Thiemard Economic generation of low-discrepancy sequences with a b-ary gray code. -# Algorithms 659, 647. http://www.netlib.org/toms/647, http://www.netlib.org/toms/659  \test the correctness of the returned values is tested by reproducing known good values.
              let FaureRsg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.IFaureRsg_Factory > ()
              /// ! Halton algorithm for low-discrepancy sequence.  For more details see chapter 8, paragraph 2 of "Monte Carlo Methods in Finance", by Peter J?ckel  \test - the correctness of the returned values is tested by reproducing known good values. - the correctness of the returned values is tested by checking their discrepancy against known good values.
              let HaltonRsg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.IHaltonRsg_Factory > ()
              /// ! Random number generator by Knuth. For more details see Knuth, Seminumerical Algorithms, 3rd edition, Section 3.6. \note This is <b>not</b> Knuth's original implementation which is available at http://www-cs-faculty.stanford.edu/~knuth/programs.html, but rather a slightly modified version wrapped in a C++ class. Such modifications did not affect the code but only the data structures used, which were converted to their standard C++ equivalents.
              let KnuthUniformRng = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.IKnuthUniformRng_Factory > ()
              /// 
              let LatticeRsg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.ILatticeRsg_Factory > ()
              /// 
              let LatticeRule = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.ILatticeRule_Factory > ()
              /// ! Random number generator of L'Ecuyer with added Bays-Durham shuffle (know as ran2 in Numerical recipes)  For more details see Section 7.1 of Numerical Recipes in C, 2nd Edition, Cambridge University Press (available at http://www.nr.com/)
              let LecuyerUniformRng = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.ILecuyerUniformRng_Factory > ()
              /// ! Mersenne Twister random number generator of period 2**19937-1  For more details see http://www.math.keio.ac.jp/matumoto/emt.html  \test the correctness of the returned values is tested by checking them against known good results.
              let MersenneTwisterUniformRng = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.IMersenneTwisterUniformRng_Factory > ()
              /// ! M. Luescher's "luxury" random number generator  Implementation is a proxy for the corresponding boost random number generator. For more detail see the boost documentation and: M.Luescher, A portable high-quality random number generator for lattice field theory simulations, Comp. Phys. Comm. 79 (1994) 100  Available luxury levels: Ranlux3: Any theoretically possible correlations have very small change of being observed. Ranlux4: highest possible luxury.
              let Ranlux3UniformRng = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.IRanlux3UniformRng_Factory > ()
              /// 
              let Ranlux4UniformRng = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.IRanlux4UniformRng_Factory > ()
              /// ! Random number generator used for automatic generation of initialization seeds.  \test correct initialization of the single instance is tested.
              let SeedGenerator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.ISeedGenerator_Factory > ()
              /// ! A Gray code counter and bitwise operations are used for very fast sequence generation.  The implementation relies on primitive polynomials modulo two from the book "Monte Carlo Methods in Finance" by Peter J?ckel.  21 200 primitive polynomials modulo two are provided in QuantLib. J?ckel has calculated 8 129 334 polynomials: if you need that many dimensions you can replace the primitivepolynomials.c file included in QuantLib with the one provided in the CD of the "Monte Carlo Methods in Finance" book.  The choice of initialization numbers (also know as free direction integers) is crucial for the homogeneity properties of the sequence. Sobol defines two homogeneity properties: Property A and Property A'.  The unit initialization numbers suggested in "Numerical Recipes in C", 2nd edition, by Press, Teukolsky, Vetterling, and Flannery (section 7.7) fail the test for Property A even for low dimensions.  Bratley and Fox published coefficients of the free direction integers up to dimension 40, crediting unpublished work of Sobol' and Levitan. See Bratley, P., Fox, B.L. (1988) "Algorithm 659: Implementing Sobol's quasirandom sequence generator," ACM Transactions on Mathematical Software 14:88-100. These values satisfy Property A for d<=20 and d = 23, 31, 33, 34, 37; Property A' holds for d<=6.  J?ckel provides in his book (section 8.3) initialization numbers up to dimension 32. Coefficients for d<=8 are the same as in Bradley-Fox, so Property A' holds for d<=6 but Property A holds for d<=32.  The implementation of Lemieux, Cieslak, and Luttmer includes coefficients of the free direction integers up to dimension 360.  Coefficients for d<=40 are the same as in Bradley-Fox. For dimension 40<d<=360 the coefficients have been calculated as optimal values based on the "resolution" criterion. See "RandQMC user's guide - A package for randomized quasi-Monte Carlo methods in C," by C. Lemieux, M. Cieslak, and K. Luttmer, version January 13 2004, and references cited there (http://www.math.ucalgary.ca/~lemieux/randqmc.html). The values up to d<=360 has been provided to the QuantLib team by Christiane Lemieux, private communication, September 2004.  For more info on Sobol' sequences see also "Monte Carlo Methods in Financial Engineering," by P. Glasserman, 2004, Springer, section 5.2.3  The Joe--Kuo numbers and the Kuo numbers are due to Stephen Joe and Frances Kuo.  S. Joe and F. Y. Kuo, Constructing Sobol sequences with better two-dimensional projections, preprint Nov 22 2007  See http://web.maths.unsw.edu.au/~fkuo/sobol/ for more information.  Note that the Kuo numbers were generated to work with a different ordering of primitive polynomials for the first 40 or so dimensions which is why we have the Alternative Primitive Polynomials.  \test - the correctness of the returned values is tested by reproducing known good values. - the correctness of the returned values is tested by checking their discrepancy against known good values.
              let SobolRsg = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Randomnumbers.ISobolRsg_Factory > ()
            end

          module Solvers1d =
            begin
              /// ! \test the correctness of the returned values is tested by checking them against known good results.
              let Bisection = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.IBisection_Factory > ()
              /// ! \test the correctness of the returned values is tested by checking them against known good results.
              let Brent = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.IBrent_Factory > ()
              /// ! \test the correctness of the returned values is tested by checking them against known good results.
              let FalsePosition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.IFalsePosition_Factory > ()
              /// ! \test the correctness of the returned values is tested by checking them against known good results.
              let FiniteDifferenceNewtonSafe = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.IFiniteDifferenceNewtonSafe_Factory > ()
              /// ! \note This solver requires that the passed function object implement a method <tt>Real derivative(Real)</tt>.  \test the correctness of the returned values is tested by checking them against known good results.
              let Newton = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.INewton_Factory > ()
              /// ! \note This solver requires that the passed function object implement a method <tt>Real derivative(Real)</tt>.  \test the correctness of the returned values is tested by checking them against known good results.
              let NewtonSafe = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.INewtonSafe_Factory > ()
              /// ! \test the correctness of the returned values is tested by checking them against known good results.
              let Ridder = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.IRidder_Factory > ()
              /// ! \test the correctness of the returned values is tested by checking them against known good results.
              let Secant = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Solvers1d.ISecant_Factory > ()
            end

          module Statistics =
            begin
              /// ! It inherit from SequenceStatistics<Statistics> and adds \f$ L^2 \f$ discrepancy calculation
              let DiscrepancyStatistics = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Statistics.IDiscrepancyStatistics_Factory > ()
              /// 
              let DoublingConvergenceSteps = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Statistics.IDoublingConvergenceSteps_Factory > ()
              /// ! This class accumulates a set of data and returns their statistics (e.g: mean, variance, skewness, kurtosis, error estimation, percentile, etc.) based on the empirical distribution (no gaussian assumption)  It doesn't suffer the numerical instability problem of IncrementalStatistics. The downside is that it stores all samples, thus increasing the memory requirements.
              let GeneralStatistics = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Statistics.IGeneralStatistics_Factory > ()
              /// ! This class computes the histogram of a given data set.  The caller can specify the number of bins, the breaks, or the algorithm for determining these quantities in computing the histogram.
              let Histogram = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Statistics.IHistogram_Factory > ()
              /// ! It can accumulate a set of data and return statistics (e.g: mean, variance, skewness, kurtosis, error estimation, etc.)  \warning high moments are numerically unstable for high average/standardDeviation ratios.
              let IncrementalStatistics = Cephei.Core.FactoryFinder.Find<Cephei.QL.Math.Statistics.IIncrementalStatistics_Factory > ()
            end
        end

      module Methods =
        begin

          module Finitedifferences =
            begin
              /// ! \todo unify the intrinsicValues/Payoff thing
              let AmericanCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IAmericanCondition_Factory > ()
              /// ! \ingroup findiff
              let BSMOperator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IBSMOperator_Factory > ()
              /// ! The differential operator \f$ D_{-} \f$ discretizes the first derivative with the first-order formula \f[ \frac{\partial u_{i}}{\partial x} \approx \frac{u_{i}-u_{i-1}}{h} = D_{-} u_{i} \f]  \ingroup findiff
              let DMinus = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IDMinus_Factory > ()
              /// ! The differential operator \f$ D_{+} \f$ discretizes the first derivative with the first-order formula \f[ \frac{\partial u_{i}}{\partial x} \approx \frac{u_{i+1}-u_{i}}{h} = D_{+} u_{i} \f]  \ingroup findiff
              let DPlus = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IDPlus_Factory > ()
              /// ! The differential operator \f$  D_{+}D_{-} \f$ discretizes the second derivative with the second-order formula \f[ \frac{\partial^2 u_{i}}{\partial x^2} \approx \frac{u_{i+1}-2u_{i}+u_{i-1}}{h^2} = D_{+}D_{-} u_{i} \f]  \ingroup findiff  \test the correctness of the returned values is tested by checking them against numerical calculations.
              let DPlusDMinus = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IDPlusDMinus_Factory > ()
              /// ! The differential operator \f$ D_{0} \f$ discretizes the first derivative with the second-order formula \f[ \frac{\partial u_{i}}{\partial x} \approx \frac{u_{i+1}-u_{i-1}}{2h} = D_{0} u_{i} \f]  \ingroup findiff  \test the correctness of the returned values is tested by checking them against numerical calculations.
              let DZero = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IDZero_Factory > ()
              /// ! \ingroup findiff  \test coefficients are tested against constant BSM operator
              let OperatorFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IOperatorFactory_Factory > ()
              /// 
              let PdeBSM = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IPdeBSM_Factory > ()
              /// 
              let PdeSecondOrderParabolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IPdeSecondOrderParabolic_Factory > ()
              /// 
              let PdeShortRate = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IPdeShortRate_Factory > ()
              /// ! A shout option is an option where the holder has the right to lock in a minimum value for the payoff at one (shout) time during the option's life. The minimum value is the option's intrinsic value at the shout time.
              let ShoutCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.IShoutCondition_Factory > ()
              /// ! \warning to use real time-dependant algebra, you must overload the corresponding operators in the inheriting time-dependent class.  \ingroup findiff
              let TridiagonalOperator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.ITridiagonalOperator_Factory > ()

              module Meshers =
                begin
                  /// 
                  let Concentrating1dMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IConcentrating1dMesher_Factory > ()
                  /// ! References: B. Hambly, S. Howison, T. Kluge, Modelling spikes and pricing swing options in electricity markets, http://people.maths.ox.ac.uk/hambly/PDF/Papers/elec.pdf
                  let ExponentialJump1dMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IExponentialJump1dMesher_Factory > ()
                  /// 
                  let Fdm1dMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IFdm1dMesher_Factory > ()
                  /// 
                  let FdmBlackScholesMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IFdmBlackScholesMesher_Factory > ()
                  /// 
                  let FdmBlackScholesMultiStrikeMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IFdmBlackScholesMultiStrikeMesher_Factory > ()
                  /// 
                  let FdmHestonVarianceMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IFdmHestonVarianceMesher_Factory > ()
                  /// 
                  let FdmMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IFdmMesher_Factory > ()
                  /// 
                  let FdmMesherComposite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IFdmMesherComposite_Factory > ()
                  /// 
                  let FdmSimpleProcess1dMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IFdmSimpleProcess1dMesher_Factory > ()
                  /// 
                  let Uniform1dMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IUniform1dMesher_Factory > ()
                  /// 
                  let UniformGridMesher = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Meshers.IUniformGridMesher_Factory > ()
                end

              module Operators =
                begin
                  /// 
                  let Fdm2dBlackScholesOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdm2dBlackScholesOp_Factory > ()
                  /// 
                  let FdmBatesOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmBatesOp_Factory > ()
                  /// 
                  let FdmBlackScholesOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmBlackScholesOp_Factory > ()
                  /// 
                  let FdmHestonEquityPart = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmHestonEquityPart_Factory > ()
                  /// 
                  let FdmHestonHullWhiteEquityPart = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmHestonHullWhiteEquityPart_Factory > ()
                  /// 
                  let FdmHestonHullWhiteOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmHestonHullWhiteOp_Factory > ()
                  /// 
                  let FdmHestonHullWhiteRatesPart = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmHestonHullWhiteRatesPart_Factory > ()
                  /// 
                  let FdmHestonHullWhiteVariancePart = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmHestonHullWhiteVariancePart_Factory > ()
                  /// 
                  let FdmHestonOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmHestonOp_Factory > ()
                  /// 
                  let FdmHestonVariancePart = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmHestonVariancePart_Factory > ()
                  /// 
                  let FdmLinearOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmLinearOp_Factory > ()
                  /// 
                  let FdmLinearOpComposite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmLinearOpComposite_Factory > ()
                  /// 
                  let FdmLinearOpIterator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmLinearOpIterator_Factory > ()
                  /// 
                  let FdmLinearOpLayout = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFdmLinearOpLayout_Factory > ()
                  /// 
                  let FirstDerivativeOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.IFirstDerivativeOp_Factory > ()
                  /// 
                  let NinePointLinearOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.INinePointLinearOp_Factory > ()
                  /// 
                  let SecondDerivativeOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.ISecondDerivativeOp_Factory > ()
                  /// 
                  let SecondOrderMixedDerivativeOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.ISecondOrderMixedDerivativeOp_Factory > ()
                  /// 
                  let TripleBandLinearOp = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Operators.ITripleBandLinearOp_Factory > ()
                end

              module Schemes =
                begin
                  /// 
                  let CraigSneydScheme = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Schemes.ICraigSneydScheme_Factory > ()
                  /// 
                  let DouglasScheme = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Schemes.IDouglasScheme_Factory > ()
                  /// 
                  let ExplicitEulerScheme = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Schemes.IExplicitEulerScheme_Factory > ()
                  /// 
                  let HundsdorferScheme = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Schemes.IHundsdorferScheme_Factory > ()
                  /// 
                  let ImplicitEulerScheme = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Schemes.IImplicitEulerScheme_Factory > ()
                  /// ! References: K. J. in ???t Hout and S. Foulon, ADI finite difference schemes for option pricing in the Heston model with correlation, http://arxiv.org/pdf/0811.3427
                  let ModifiedCraigSneydScheme = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Schemes.IModifiedCraigSneydScheme_Factory > ()
                end

              module Solvers =
                begin
                  /// 
                  let Fdm2dBlackScholesSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdm2dBlackScholesSolver_Factory > ()
                  /// 
                  let Fdm2DimSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdm2DimSolver_Factory > ()
                  /// 
                  let Fdm3DimSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdm3DimSolver_Factory > ()
                  /// 
                  let FdmBackwardSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmBackwardSolver_Factory > ()
                  /// 
                  let FdmBatesSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmBatesSolver_Factory > ()
                  /// 
                  let FdmBlackScholesSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmBlackScholesSolver_Factory > ()
                  /// 
                  let FdmHestonHullWhiteSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmHestonHullWhiteSolver_Factory > ()
                  /// 
                  let FdmHestonSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmHestonSolver_Factory > ()
                  /// 
                  let FdmSchemeDesc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmSchemeDesc_Factory > ()
                  /// 
                  let FdmSimple2dBSSolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmSimple2dBSSolver_Factory > ()
                  /// 
                  let FdmSolverDesc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Solvers.IFdmSolverDesc_Factory > ()
                end

              module Stepconditions =
                begin
                  /// 
                  let FdmAmericanStepCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Stepconditions.IFdmAmericanStepCondition_Factory > ()
                  /// 
                  let FdmArithmeticAverageCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Stepconditions.IFdmArithmeticAverageCondition_Factory > ()
                  /// 
                  let FdmBermudanStepCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Stepconditions.IFdmBermudanStepCondition_Factory > ()
                  /// 
                  let FdmSimpleStorageCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Stepconditions.IFdmSimpleStorageCondition_Factory > ()
                  /// 
                  let FdmSimpleSwingCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Stepconditions.IFdmSimpleSwingCondition_Factory > ()
                  /// 
                  let FdmSnapshotCondition = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Stepconditions.IFdmSnapshotCondition_Factory > ()
                  /// 
                  let FdmStepConditionComposite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Stepconditions.IFdmStepConditionComposite_Factory > ()
                end

              module Utilities =
                begin
                  /// 
                  let FdmDividendHandler = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Utilities.IFdmDividendHandler_Factory > ()
                  /// 
                  let FdmInnerValueCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Utilities.IFdmInnerValueCalculator_Factory > ()
                  /// 
                  let FdmLogBasketInnerValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Utilities.IFdmLogBasketInnerValue_Factory > ()
                  /// 
                  let FdmLogInnerValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Utilities.IFdmLogInnerValue_Factory > ()
                  /// 
                  let FdmQuantoHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Utilities.IFdmQuantoHelper_Factory > ()
                  /// 
                  let FdmZeroInnerValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Finitedifferences.Utilities.IFdmZeroInnerValue_Factory > ()
                end
            end

          module Lattices =
            begin
              /// ! \ingroup lattices
              let AdditiveEQPBinomialTree = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.IAdditiveEQPBinomialTree_Factory > ()
              /// ! \ingroup lattices
              let CoxRossRubinstein = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.ICoxRossRubinstein_Factory > ()
              /// ! \ingroup lattices
              let JarrowRudd = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.IJarrowRudd_Factory > ()
              /// 
              let Joshi4 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.IJoshi4_Factory > ()
              /// ! \ingroup lattices
              let LeisenReimer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.ILeisenReimer_Factory > ()
              /// ! \ingroup lattices
              let Tian = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.ITian_Factory > ()
              /// ! \ingroup lattices
              let Trigeorgis = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.ITrigeorgis_Factory > ()
              /// ! This class defines a recombining trinomial tree approximating a 1-D stochastic process. \warning The diffusion term of the SDE must be independent of the underlying process.  \ingroup lattices
              let TrinomialTree = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Lattices.ITrinomialTree_Factory > ()
            end

          module Montecarlo =
            begin
              /// ! This class generates normalized (i.e., unit-variance) paths as sequences of variations. In order to obtain the actual path of the underlying, the returned variations must be multiplied by the integrated variance (including time) over the corresponding time step.  \ingroup mcarlo
              let BrownianBridge = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Montecarlo.IBrownianBridge_Factory > ()
              /// 
              let LsmBasisSystem = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Montecarlo.ILsmBasisSystem_Factory > ()
              /// ! MultiPath contains the list of paths for each asset, i.e., multipath[j] is the path followed by the j-th asset.  \ingroup mcarlo
              let MultiPath = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Montecarlo.IMultiPath_Factory > ()
              /// 
              let NodeData = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Montecarlo.INodeData_Factory > ()
              /// 
              let ParametricExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Montecarlo.IParametricExercise_Factory > ()
              /// ! \ingroup mcarlo  \note the path includes the initial asset value as its first point.
              let Path = Cephei.Core.FactoryFinder.Find<Cephei.QL.Methods.Montecarlo.IPath_Factory > ()
            end
        end

      module Models =
        begin
          /// ! Base class for analytically tractable models.  \ingroup shortrate
          let AffineModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.IAffineModel_Factory > ()
          /// ! Calibrated model class
          let CalibratedModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.ICalibratedModel_Factory > ()
          /// ! liquid market instrument used during calibration
          let CalibrationHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.ICalibrationHelper_Factory > ()
          /// ! Standard constant parameter \f$ a(t) = a \f$
          let ConstantParameter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.IConstantParameter_Factory > ()
          /// ! %Parameter which is always zero \f$ a(t) = 0 \f$
          let NullParameter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.INullParameter_Factory > ()
          /// ! Base class for model arguments
          let Parameter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.IParameter_Factory > ()
          /// ! \f$ a(t) = a_i if t_{i-1} \geq t < t_i \f$. This kind of parameter is usually used to enhance the fitting of a model
          let PiecewiseConstantParameter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.IPiecewiseConstantParameter_Factory > ()
          /// ! \ingroup shortrate
          let ShortRateModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.IShortRateModel_Factory > ()
          /// ! This is a base class for models that can reprice exactly any discount bond.  \ingroup shortrate
          let TermStructureConsistentModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.ITermStructureConsistentModel_Factory > ()
          /// ! Deterministic time-dependent parameter used for yield-curve fitting
          let TermStructureFittingParameter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.ITermStructureFittingParameter_Factory > ()

          module Equity =
            begin
              /// 
              let BatesDetJumpModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IBatesDetJumpModel_Factory > ()
              /// 
              let BatesDoubleExpDetJumpModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IBatesDoubleExpDetJumpModel_Factory > ()
              /// 
              let BatesDoubleExpModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IBatesDoubleExpModel_Factory > ()
              /// ! extended versions of Heston model for the stochastic volatility of an asset including jumps.  References: A. Sepp, Pricing European-Style Options under Jump Diffusion Processes with Stochastic Volatility: Applications of Fourier Transform (<http://math.ut.ee/~spartak/papers/stochjumpvols.pdf>)  \test calibration is tested against known values.
              let BatesModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IBatesModel_Factory > ()
              /// ! References:  Glosten, L., Jagannathan, R., Runkle, D., 1993. Relationship between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance 48, 1779-1801  \test calibration is not implemented for GJR-GARCH
              let GJRGARCHModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IGJRGARCHModel_Factory > ()
              /// ! References:  Heston, Steven L., 1993. A Closed-Form Solution for Options with Stochastic Volatility with Applications to Bond and Currency Options.  The review of Financial Studies, Volume 6, Issue 2, 327-343.  \test calibration is tested against known good values.
              let HestonModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IHestonModel_Factory > ()
              /// ! calibration helper for Heston model
              let HestonModelHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IHestonModelHelper_Factory > ()
              /// ! References:  Heston, Steven L., 1993. A Closed-Form Solution for Options with Stochastic Volatility with Applications to Bond and Currency Options.  The review of Financial Studies, Volume 6, Issue 2, 327-343.  A. Elices, Models with time-dependent parameters using transform methods: application to Heston???s model, http://arxiv.org/pdf/0708.2020
              let PiecewiseTimeDependentHestonModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Equity.IPiecewiseTimeDependentHestonModel_Factory > ()
            end

          module Marketmodels =
            begin
              /// ! Engine collecting cash flows along a market-model simulation
              let AccountingEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IAccountingEngine_Factory > ()
              /// 
              let BrownianGenerator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IBrownianGenerator_Factory > ()
              /// 
              let BrownianGeneratorFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IBrownianGeneratorFactory_Factory > ()
              /// ! Abstract base class. Requires extra methods above that of marketmodelevolver to let you fix rates via importance sampling.  The evolver does the actual gritty work of evolving the forward rates from one time to the next.  This is intended to be used for the Fries-Joshi proxy simulation approach to Greeks
              let ConstrainedEvolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IConstrainedEvolver_Factory > ()
              /// ! This class stores the state of the yield curve associated to the fixed calendar times within the simulation. This is the workhorse discounting object associated to the rate times of the simulation. It's important to pass the rates via an object like this to the product rather than directly to make it easier to switch to other engines such as a coterminal swap rate engine. Many products will not need expired rates and others will only require the first rate.
              let CurveState = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.ICurveState_Factory > ()
              /// ! This class stores: -# evolutionTimes = the times at which the rates need to be known, -# rateTimes = the times defining the rates that are to be evolved, -# relevanceRates = which rates need to be known at each time.  This class is really just a tuple of evolution and rate times; - there will be n+1 rate times expressing payment and reset times of forward rates. - there will be any number of evolution times. - we also store which part of the rates are relevant for pricing via relevance rates. The important part for the i-th step will then range from relevanceRates[i].first to relevanceRates[i].second. Default values for relevance rates will be 0 and n. - example for n = 5: <pre> |-----|-----|-----|-----|-----|      (size = 6) t0    t1    t2    t3    t4    t5     rateTimes f0    f1    f2    f3    f4           forwardRates d0    d1    d2    d3    d4    d5     discountBonds d0/d0 d1/d0 d2/d0 d3/d0 d4/d0 d5/d0  discountRatios sr0   sr1   sr2   sr3   sr4          coterminalSwaps </pre>
              let EvolutionDescription = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IEvolutionDescription_Factory > ()
              /// 
              let HistoricalForwardRatesAnalysis = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IHistoricalForwardRatesAnalysis_Factory > ()
              /// ! %Historical rate analysis class
              let HistoricalRatesAnalysis = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IHistoricalRatesAnalysis_Factory > ()
              /// ! For each time step, generates the pseudo-square root of the covariance matrix for that time step.
              let MarketModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModel_Factory > ()
              /// 
              let MarketModelDiscounter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelDiscounter_Factory > ()
              /// ! Abstract base class. The evolver does the actual gritty work of evolving the forward rates from one time to the next.
              let MarketModelEvolver = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelEvolver_Factory > ()
              /// ! base class for market-model factories
              let MarketModelFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelFactory_Factory > ()
              /// ASC021121
              let MarketModelMultiProduct = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelMultiProduct_Factory > ()
              /// ASC091127 Move cashflow into its own class
              let MarketModelMultiProductCashFlow = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelMultiProductCashFlow_Factory > ()
              /// ! this class returns the number of units of the discretely compounding money market account that 1 unit of cash at the payment can buy using the LIBOR rates from current step.  It also returns the derivative of this number with respect to each of the rates.  Discounting is purely based on the simulation LIBOR rates, to get a discounting back to zero you need to multiply by the discount factor of t_0.
              let MarketModelPathwiseDiscounter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelPathwiseDiscounter_Factory > ()
              /// ASC091127
              let MarketModelPathwiseMultiProduct = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelPathwiseMultiProduct_Factory > ()
              /// ASC021127 moved outside of the class for .NET access
              let MarketModelPathwiseMultiProductCashFlow = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IMarketModelPathwiseMultiProductCashFlow_Factory > ()
              /// ! Engine collecting cash flows along a market-model simulation for doing pathwise computation of Deltas using Giles--Glasserman smoking adjoints method note only works with displaced LMM, and requires knowledge of pseudo-roots and displacements This is tested in MarketModelTest::testPathwiseGreeks
              let PathwiseAccountingEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IPathwiseAccountingEngine_Factory > ()
              /// ! Engine collecting cash flows along a market-model simulation for doing pathwise computation of Deltas and vegas using Giles--Glasserman smoking adjoints method note only works with displaced LMM,  The method is intimately connected with log-normal Euler evolution  We must work with discretely compounding MM account To compute a vega means changing the pseudo-square root at each time step So for each vega, we have a vector of matrices. So we need a vector of vectors of matrices to compute all the vegas. We do the outermost vector by time step and inner one by which vega. This is tested in MarketModelTest::testPathwiseVegas
              let PathwiseVegasAccountingEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IPathwiseVegasAccountingEngine_Factory > ()
              /// ! Engine collecting cash flows along a market-model simulation for doing pathwise computation of Deltas and vegas using Giles--Glasserman smoking adjoints method note only works with displaced LMM,  The method is intimately connected with log-normal Euler evolution  We must work with discretely compounding MM account To compute a vega means changing the pseudo-square root at each time step So for each vega, we have a vector of matrices. So we need a vector of vectors of matrices to compute all the vegas. We do the outermost vector by time step and inner one by which vega. This implementation is different in that all the linear combinations by the bumps are done as late as possible, whereas PathwiseVegasAccountingEngine does them as early as possible. This is tested in MarketModelTest::testPathwiseVegas
              let PathwiseVegasOuterAccountingEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IPathwiseVegasOuterAccountingEngine_Factory > ()
              /// corrTimes must include all rateTimes but the last
              let PiecewiseConstantCorrelation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.IPiecewiseConstantCorrelation_Factory > ()
              /// 
              let SwapForwardMappings = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.ISwapForwardMappings_Factory > ()

              module Browniangenerators =
                begin
                  /// ! Incremental Brownian generator using a Mersenne-twister uniform generator and inverse-cumulative Gaussian method.  \note At this time, generation of the underlying uniform sequence is eager, while its transformation into Gaussian variates is lazy.  Further optimization might be possible by using the Mersenne twister directly instead of a RandomSequenceGenerator; however, it is not clear how much of a difference this would make when compared to the inverse-cumulative Gaussian calculation.
                  let MTBrownianGenerator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Browniangenerators.IMTBrownianGenerator_Factory > ()
                  /// 
                  let MTBrownianGeneratorFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Browniangenerators.IMTBrownianGeneratorFactory_Factory > ()
                  /// ! Incremental Brownian generator using a Sobol generator, inverse-cumulative Gaussian method, and Brownian bridging.
                  let SobolBrownianGenerator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Browniangenerators.ISobolBrownianGenerator_Factory > ()
                  /// 
                  let SobolBrownianGeneratorFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Browniangenerators.ISobolBrownianGeneratorFactory_Factory > ()
                end

              module Callability =
                begin
                  /// 
                  let BermudanSwaptionExerciseValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.IBermudanSwaptionExerciseValue_Factory > ()
                  /// 
                  let LongstaffSchwartzExerciseStrategy = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.ILongstaffSchwartzExerciseStrategy_Factory > ()
                  /// 
                  let MarketModelBasisSystem = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.IMarketModelBasisSystem_Factory > ()
                  /// struct MarketModelMultiProduct::CashFlow;
                  let MarketModelExerciseValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.IMarketModelExerciseValue_Factory > ()
                  /// 
                  let MarketModelNodeDataProvider = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.IMarketModelNodeDataProvider_Factory > ()
                  /// 
                  let MarketModelParametricExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.IMarketModelParametricExercise_Factory > ()
                  /// 
                  let NothingExerciseValue = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.INothingExerciseValue_Factory > ()
                  /// 
                  let ParametricExerciseAdapter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.IParametricExerciseAdapter_Factory > ()
                  /// 
                  let SwapBasisSystem = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.ISwapBasisSystem_Factory > ()
                  /// 
                  let SwapForwardBasisSystem = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.ISwapForwardBasisSystem_Factory > ()
                  /// 
                  let SwapRateTrigger = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.ISwapRateTrigger_Factory > ()
                  /// 
                  let TriggeredSwapExercise = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.ITriggeredSwapExercise_Factory > ()
                  /// ! \pre product and hedge must have the same rate times and exercise times
                  let UpperBoundEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Callability.IUpperBoundEngine_Factory > ()
                end

              module Correlations =
                begin
                  /// 
                  let CotSwapFromFwdCorrelation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Correlations.ICotSwapFromFwdCorrelation_Factory > ()
                  /// 
                  let ExponentialForwardCorrelation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Correlations.IExponentialForwardCorrelation_Factory > ()
                  /// 
                  let TimeHomogeneousForwardCorrelation = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Correlations.ITimeHomogeneousForwardCorrelation_Factory > ()
                end

              module Curvestates =
                begin
                  /// ! %Curve state for constant-maturity-swap market models
                  let CMSwapCurveState = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Curvestates.ICMSwapCurveState_Factory > ()
                  /// ! This class stores the state of the yield curve associated to the fixed calendar times within the simulation. This is the workhorse discounting object associated to the rate times of the simulation. It's important to pass the rates via an object like this to the product rather than directly to make it easier to switch to other engines such as a coterminal swap rate engine. Many products will not need expired rates and others will only require the first rate.
                  let CoterminalSwapCurveState = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Curvestates.ICoterminalSwapCurveState_Factory > ()
                  /// ! This class stores the state of the yield curve associated to the fixed calendar times within the simulation. This is the workhorse discounting object associated to the rate times of the simulation. It's important to pass the rates via an object like this to the product rather than directly to make it easier to switch to other engines such as a coterminal swap rate engine. Many products will not need expired rates and others will only require the first rate.
                  let LMMCurveState = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Curvestates.ILMMCurveState_Factory > ()
                end

              module Driftcomputation =
                begin
                  /// ! Returns the drift \f$ \mu \Delta t \f$. See Mark Joshi, <i>Rapid Computation of Drifts in a Reduced Factor Libor Market Model</i>, Wilmott Magazine, May 2003.
                  let CMSMMDriftCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Driftcomputation.ICMSMMDriftCalculator_Factory > ()
                  /// ! Returns the drift \f$ \mu \Delta t \f$. See Mark Joshi, <i>Rapid Computation of Drifts in a Reduced Factor Libor Market Model</i>, Wilmott Magazine, May 2003.
                  let LMMDriftCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Driftcomputation.ILMMDriftCalculator_Factory > ()
                  /// ! Returns the drift \f$ \mu \Delta t \f$. See Mark Joshi, <i>Rapid Computation of Drifts in a Reduced Factor Libor Market Model</i>, Wilmott Magazine, May 2003.
                  let LMMNormalDriftCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Driftcomputation.ILMMNormalDriftCalculator_Factory > ()
                  /// ! Returns the drift \f$ \mu \Delta t \f$. See Mark Joshi, Lorenzo Liesch, <i>Effective Implementation Of Generic Market Models</i>.
                  let SMMDriftCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Driftcomputation.ISMMDriftCalculator_Factory > ()
                end

              module Evolvers =
                begin
                  /// ! Predictor-Corrector
                  let LogNormalCmSwapRatePc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalCmSwapRatePc_Factory > ()
                  /// ! Predictor-Corrector
                  let LogNormalCotSwapRatePc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalCotSwapRatePc_Factory > ()
                  /// ! Iterative Predictor-Corrector
                  let LogNormalFwdRateBalland = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalFwdRateBalland_Factory > ()
                  /// ! Euler
                  let LogNormalFwdRateEuler = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalFwdRateEuler_Factory > ()
                  /// ! euler stepping
                  let LogNormalFwdRateEulerConstrained = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalFwdRateEulerConstrained_Factory > ()
                  /// ! Iterative Predictor-Corrector
                  let LogNormalFwdRateiBalland = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalFwdRateiBalland_Factory > ()
                  /// ! Iterative Predictor-Corrector
                  let LogNormalFwdRateIpc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalFwdRateIpc_Factory > ()
                  /// ! Predictor-Corrector
                  let LogNormalFwdRatePc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ILogNormalFwdRatePc_Factory > ()
                  /// ! Displaced diffusion LMM with uncorrelated vol process. Called "Shifted BGM" with Heston vol by Brace in "Engineering BGM." Vol process is an external input.
                  let MarketModelVolProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.IMarketModelVolProcess_Factory > ()
                  /// ! Predictor-Corrector
                  let NormalFwdRatePc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.INormalFwdRatePc_Factory > ()
                  /// ! Displaced diffusion LMM with uncorrelated vol process. Called "Shifted BGM" with Heston vol by Brac in "Engineering BGM." Vol process is an external input.
                  let SVDDFwdRatePc = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.ISVDDFwdRatePc_Factory > ()

                  module Volprocesses =
                    begin
                      /// ! Displaced diffusion LMM with uncorrelated vol process. Called "Shifted BGM" with Heston vol by Brace in "Engineering BGM." Vol process is an external input.
                      let SquareRootAndersen = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Evolvers.Volprocesses.ISquareRootAndersen_Factory > ()
                    end
                end

              module Models =
                begin
                  /// ! %Abcd-interpolated volatility structure
                  let AbcdVol = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IAbcdVol_Factory > ()
                  /// 
                  let AlphaFinder = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IAlphaFinder_Factory > ()
                  /// 
                  let AlphaForm = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IAlphaForm_Factory > ()
                  /// 
                  let AlphaFormInverseLinear = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IAlphaFormInverseLinear_Factory > ()
                  /// 
                  let AlphaFormLinearHyperbolic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IAlphaFormLinearHyperbolic_Factory > ()
                  /// 
                  let CotSwapToFwdAdapter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.ICotSwapToFwdAdapter_Factory > ()
                  /// 
                  let CotSwapToFwdAdapterFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.ICotSwapToFwdAdapterFactory_Factory > ()
                  /// 
                  let CTSMMCapletAlphaFormCalibration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.ICTSMMCapletAlphaFormCalibration_Factory > ()
                  /// 
                  let CTSMMCapletCalibration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.ICTSMMCapletCalibration_Factory > ()
                  /// 
                  let CTSMMCapletMaxHomogeneityCalibration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.ICTSMMCapletMaxHomogeneityCalibration_Factory > ()
                  /// 
                  let CTSMMCapletOriginalCalibration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.ICTSMMCapletOriginalCalibration_Factory > ()
                  /// 
                  let FlatVol = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IFlatVol_Factory > ()
                  /// 
                  let FlatVolFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IFlatVolFactory_Factory > ()
                  /// 
                  let FwdPeriodAdapter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IFwdPeriodAdapter_Factory > ()
                  /// 
                  let FwdToCotSwapAdapter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IFwdToCotSwapAdapter_Factory > ()
                  /// 
                  let FwdToCotSwapAdapterFactory = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IFwdToCotSwapAdapterFactory_Factory > ()
                  /// 
                  let PiecewiseConstantAbcdVariance = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IPiecewiseConstantAbcdVariance_Factory > ()
                  /// 
                  let PiecewiseConstantVariance = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IPiecewiseConstantVariance_Factory > ()
                  /// 
                  let PseudoRootFacade = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IPseudoRootFacade_Factory > ()
                  /// 
                  let VolatilityInterpolationSpecifier = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IVolatilityInterpolationSpecifier_Factory > ()
                  /// 
                  let VolatilityInterpolationSpecifierabcd = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Models.IVolatilityInterpolationSpecifierabcd_Factory > ()
                end

              module Pathwisegreeks =
                begin
                  /// ! In order to compute market vegas, we need a class that gives the derivative of a cap implied vol against changes in pseudo-root elements. This is that class.  The operation is non-trivial because the cap implied vol has a complicated relationship with the caplet implied vols.  This is  tested in the pathwise vegas routine in MarketModels.cpp
                  let CapPseudoDerivative = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.ICapPseudoDerivative_Factory > ()
                  /// ! Pass in a market model, a list of instruments, and possible bumps.  Get out pseudo-root bumps that shift each implied vol by one percent, and leave the other instruments fixed.  If the contribution of an instrument is too correlated with other instruments used, discard it.
                  let OrthogonalizedBumpFinder = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IOrthogonalizedBumpFinder_Factory > ()
                  /// 
                  let RatePseudoRootJacobian = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IRatePseudoRootJacobian_Factory > ()
                  /// 
                  let RatePseudoRootJacobianAllElements = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IRatePseudoRootJacobianAllElements_Factory > ()
                  /// 
                  let RatePseudoRootJacobianNumerical = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IRatePseudoRootJacobianNumerical_Factory > ()
                  /// 
                  let SwaptionPseudoDerivative = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.ISwaptionPseudoDerivative_Factory > ()
                  /// 
                  let VegaBumpCluster = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IVegaBumpCluster_Factory > ()
                  /// ! There are too many pseudo-root elements to allow bumping them all independently so we cluster them together and then divide all elements into a collection of such clusters.
                  let VegaBumpCollection = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IVegaBumpCollection_Factory > ()
                  /// ASC091127
                  let VolatilityBumpInstrumentJacobian = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IVolatilityBumpInstrumentJacobian_Factory > ()
                  /// 
                  let VolatilityBumpInstrumentJacobianCap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IVolatilityBumpInstrumentJacobianCap_Factory > ()
                  /// ASC091127 move from being innter class
                  let VolatilityBumpInstrumentJacobianSwaption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Pathwisegreeks.IVolatilityBumpInstrumentJacobianSwaption_Factory > ()
                end

              module Products =
                begin
                  /// ! Instances of this class build a market-model product by composing one or more subproducts.  \pre All subproducts must have the same rate times.
                  let MarketModelComposite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.IMarketModelComposite_Factory > ()
                  /// ! Instances of this class build a multiple market-model product by composing two or more subproducts.  \pre All subproducts must have the same rate times.
                  let MultiProductComposite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.IMultiProductComposite_Factory > ()
                  /// ! This is the abstract base class that encapsulates the notion of a MarketModelMultiProduct which can be evaluated in a more than one step (aka Rebonato's long jump).
                  let MultiProductMultiStep = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.IMultiProductMultiStep_Factory > ()
                  /// ! This is the abstract base class that encapsulates the notion of a MarketModelMultiProduct which can be evaluated in one step (aka Rebonato's very long jump).
                  let MultiProductOneStep = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.IMultiProductOneStep_Factory > ()
                  /// ! Instances of this class build a single market-model product by composing two or more subproducts.  \pre All subproducts must have the same rate times.
                  let SingleProductComposite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.ISingleProductComposite_Factory > ()

                  module Multistep =
                    begin
                      /// 
                      let CallSpecifiedMultiProduct = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.ICallSpecifiedMultiProduct_Factory > ()
                      /// 
                      let ExerciseAdapter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IExerciseAdapter_Factory > ()
                      /// ! Class to model receipt of a fixed cash amount once. Product terminates immediately. Mainly useful as rebate received when another product is cancelled.
                      let MarketModelCashRebate = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMarketModelCashRebate_Factory > ()
                      /// ! MultiStepPathwiseWrapper Pathwise products do everything that ordinary products do and more. This lets you treat a pathwise product as an ordinary product. So you only have to write the product once.  Tested in MarketModels::testInverseFloater()
                      let MultiProductPathwiseWrapper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiProductPathwiseWrapper_Factory > ()
                      /// 
                      let MultiStepCoinitialSwaps = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepCoinitialSwaps_Factory > ()
                      /// 
                      let MultiStepCoterminalSwaps = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepCoterminalSwaps_Factory > ()
                      /// 
                      let MultiStepCoterminalSwaptions = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepCoterminalSwaptions_Factory > ()
                      /// 
                      let MultiStepForwards = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepForwards_Factory > ()
                      /// Tested in MarketModels::testInverseFloater()
                      let MultiStepInverseFloater = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepInverseFloater_Factory > ()
                      /// 
                      let MultiStepNothing = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepNothing_Factory > ()
                      /// 
                      let MultiStepOptionlets = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepOptionlets_Factory > ()
                      /// 
                      let MultiStepPeriodCapletSwaptions = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepPeriodCapletSwaptions_Factory > ()
                      /// 
                      let MultiStepRatchet = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepRatchet_Factory > ()
                      /// TODO: add payer/receiver choice
                      let MultiStepSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepSwap_Factory > ()
                      /// ! Price a swaption associated to a contiguous subset of rates. Useful only for testing purposes. Steps through all rate times up to start of swap.
                      let MultiStepSwaption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepSwaption_Factory > ()
                      /// 
                      let MultiStepTarn = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Multistep.IMultiStepTarn_Factory > ()
                    end

                  module Onestep =
                    begin
                      /// 
                      let OneStepCoinitialSwaps = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Onestep.IOneStepCoinitialSwaps_Factory > ()
                      /// 
                      let OneStepCoterminalSwaps = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Onestep.IOneStepCoterminalSwaps_Factory > ()
                      /// 
                      let OneStepForwards = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Onestep.IOneStepForwards_Factory > ()
                      /// 
                      let OneStepOptionlets = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Onestep.IOneStepOptionlets_Factory > ()
                    end

                  module Pathwise =
                    begin
                      /// 
                      let CallSpecifiedPathwiseMultiProduct = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.ICallSpecifiedPathwiseMultiProduct_Factory > ()
                      /// ! Swap for doing simple cash rebate. Fairly useless when used directly, but if we want to look a breakable swap it becomes useful.
                      let MarketModelPathwiseCashRebate = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseCashRebate_Factory > ()
                      /// ! Main use is to test market pathwise vegas. The swaptions are payers and co-terminal. The class is tested in TestPathwiseVegas by running against the numerical version below.
                      let MarketModelPathwiseCoterminalSwaptionsDeflated = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseCoterminalSwaptionsDeflated_Factory > ()
                      /// ! Easiest way to test MarketModelPathwiseCoterminalSwaptionsDeflated is by doing a numerical differentiation version.
                      let MarketModelPathwiseCoterminalSwaptionsNumericalDeflated = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseCoterminalSwaptionsNumericalDeflated_Factory > ()
                      /// ! Pathwise product inverse floater for doing Greeks Tested in MarketModels::testInverseFloater()
                      let MarketModelPathwiseInverseFloater = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseInverseFloater_Factory > ()
                      /// ! implementation of path wise methodology for caplets, essentially a test class since we have better ways of computing Greeks of caplets  used in   MarketModelTest::testPathwiseVegas and       MarketModelTest::testPathwiseGreeks
                      let MarketModelPathwiseMultiCaplet = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseMultiCaplet_Factory > ()
                      /// ! MarketModelPathwiseMultiDeflatedCap to price several caps and get their derivatives simultaneously. Mainly useful for testing pathwise market vegas code.
                      let MarketModelPathwiseMultiDeflatedCap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseMultiDeflatedCap_Factory > ()
                      /// 
                      let MarketModelPathwiseMultiDeflatedCaplet = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseMultiDeflatedCaplet_Factory > ()
                      /// ! Swap for doing Greeks. Fairly useless when used directly, but if we want to look a breakable swap it becomes useful.
                      let MarketModelPathwiseSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Marketmodels.Products.Pathwise.IMarketModelPathwiseSwap_Factory > ()
                    end
                end
            end

          module Shortrate =
            begin
              /// ! Single-factor models with an analytical formula for discount bonds should inherit from this class. They must then implement the functions \f$ A(t,T) \f$ and \f$ B(t,T) \f$ such that \f[ P(t, T, r_t) = A(t,T)e^{ -B(t,T) r_t}. \f]  \ingroup shortrate
              let OneFactorAffineModel = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Shortrate.IOneFactorAffineModel_Factory > ()

              module Calibrationhelpers =
                begin
                  /// ! \bug This helper does not register with the passed IBOR index and with the evaluation date. Furthermore, the ATM strike rate is not recalculated when any of its observables change.
                  let CapHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Shortrate.Calibrationhelpers.ICapHelper_Factory > ()
                  /// ! \bug This helper does not register with the passed IBOR index and with the evaluation date. Furthermore, the ATM exercise rate is not recalculated when any of its observables change.
                  let SwaptionHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Shortrate.Calibrationhelpers.ISwaptionHelper_Factory > ()
                end

              module Onefactormodels =
                begin
                  /// ! This class implements the standard Black-Karasinski model defined by \f[ d\ln r_t = (\theta(t) - \alpha \ln r_t)dt + \sigma dW_t, \f] where \f$ alpha \f$ and \f$ sigma \f$ are constants.  \ingroup shortrate
                  let BlackKarasinski = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Shortrate.Onefactormodels.IBlackKarasinski_Factory > ()
                  /// ! This class implements the standard single-factor Hull-White model defined by \f[ dr_t = (\theta(t) - \alpha r_t)dt + \sigma dW_t \f] where \f$ \alpha \f$ and \f$ \sigma \f$ are constants.  \test calibration results are tested against cached values  \bug When the term structure is relinked, the r0 parameter of the underlying Vasicek model is not updated.  \ingroup shortrate
                  let HullWhite = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Shortrate.Onefactormodels.IHullWhite_Factory > ()
                  /// ! This class implements the Vasicek model defined by \f[ dr_t = a(b - r_t)dt + \sigma dW_t , \f] where \f$ a \f$, \f$ b \f$ and \f$ \sigma \f$ are constants; a risk premium \f$ \lambda \f$ can also be specified.  \ingroup shortrate
                  let Vasicek = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Shortrate.Onefactormodels.IVasicek_Factory > ()
                end

              module Twofactormodels =
                begin
                end
            end

          module Volatility =
            begin
              /// ! Volatilities are assumed to be expressed on an annual basis.
              let ConstantEstimator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IConstantEstimator_Factory > ()
              /// ! Volatilities are assumed to be expressed on an annual basis.
              let Garch11 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarch11_Factory > ()
              /// ! This class implements a concrete volatility model based on high low formulas using the method of Garman and Klass in their paper "On the Estimation of the Security Price from Historical Data" at http://www.fea.com/resources/pdf/a_estimation_of_security_price.pdf  Volatilities are assumed to be expressed on an annual basis.
              let GarmanKlassAbstract = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarmanKlassAbstract_Factory > ()
              /// 
              let GarmanKlassSigma1 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarmanKlassSigma1_Factory > ()
              /// 
              let GarmanKlassSigma3 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarmanKlassSigma3_Factory > ()
              /// 
              let GarmanKlassSigma4 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarmanKlassSigma4_Factory > ()
              /// 
              let GarmanKlassSigma5 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarmanKlassSigma5_Factory > ()
              /// 
              let GarmanKlassSigma6 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarmanKlassSigma6_Factory > ()
              /// 
              let GarmanKlassSimpleSigma = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IGarmanKlassSimpleSigma_Factory > ()
              /// 
              let ParkinsonSigma = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.IParkinsonSigma_Factory > ()
              /// ! Volatilities are assumed to be expressed on an annual basis.
              let SimpleLocalEstimator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Models.Volatility.ISimpleLocalEstimator_Factory > ()
            end
        end

      module Patterns =
        begin
        end

      module Pricingengines =
        begin
          /// ! \todo calculate greeks
          let AmericanPayoffAtExpiry = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.IAmericanPayoffAtExpiry_Factory > ()
          /// ! \todo calculate greeks
          let AmericanPayoffAtHit = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.IAmericanPayoffAtHit_Factory > ()
          /// ! \bug When the variance is null, division by zero occur during the calculation of delta, delta forward, gamma, gamma forward, rho, dividend rho, vega, and strike sensitivity.
          let BlackCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.IBlackCalculator_Factory > ()
          /// ! Black-Scholes 1973 calculator class
          let BlackScholesCalculator = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.IBlackScholesCalculator_Factory > ()

          module Asian =
            begin
              /// ! This class implements a continuous geometric average price Asian option with European exercise.  The formula is from "Option Pricing Formulas", E. G. Haug (1997) pag 96-97.  \ingroup asianengines  \test - the correctness of the returned value is tested by reproducing results available in literature, and results obtained using a discrete average approximation. - the correctness of the returned greeks is tested by reproducing numerical derivatives.  \todo handle seasoned options
              let AnalyticContinuousGeometricAveragePriceAsianEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Asian.IAnalyticContinuousGeometricAveragePriceAsianEngine_Factory > ()
              /// ! This class implements a discrete geometric average price Asian option, with European exercise.  The formula is from "Asian Option", E. Levy (1997) in "Exotic Options: The State of the Art", edited by L. Clewlow, C. Strickland, pag 65-97  \todo implement correct theta, rho, and dividend-rho calculation  \test - the correctness of the returned value is tested by reproducing results available in literature. - the correctness of the available greeks is tested against numerical calculations.  \ingroup asianengines
              let AnalyticDiscreteGeometricAveragePriceAsianEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Asian.IAnalyticDiscreteGeometricAveragePriceAsianEngine_Factory > ()
              /// ! This class implements a discrete geometric average-strike Asian option, with European exercise.  The formula is from "Asian Option", E. Levy (1997) in "Exotic Options: The State of the Art", edited by L. Clewlow, C. Strickland, pag 65-97  \test - the correctness of the returned value is tested by reproducing known good results.  \ingroup asianengines
              let AnalyticDiscreteGeometricAverageStrikeAsianEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Asian.IAnalyticDiscreteGeometricAverageStrikeAsianEngine_Factory > ()
              /// 
              let ArithmeticAPOPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Asian.IArithmeticAPOPathPricer_Factory > ()
              /// 
              let ArithmeticASOPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Asian.IArithmeticASOPathPricer_Factory > ()
              /// 
              let FdBlackScholesAsianEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Asian.IFdBlackScholesAsianEngine_Factory > ()
              /// 
              let GeometricAPOPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Asian.IGeometricAPOPathPricer_Factory > ()
            end

          module Barrier =
            begin
              /// ! The formulas are taken from "Option pricing formulas", E.G. Haug, McGraw-Hill, p.69 and following.  \ingroup barrierengines  \test the correctness of the returned value is tested by reproducing results available in literature.
              let AnalyticBarrierEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Barrier.IAnalyticBarrierEngine_Factory > ()
              /// 
              let BarrierPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Barrier.IBarrierPathPricer_Factory > ()
              /// 
              let BiasedBarrierPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Barrier.IBiasedBarrierPathPricer_Factory > ()
              /// ! \ingroup barrierengines  \test the correctness of the returned value is tested by reproducing results available in web/literature and comparison with Black pricing.
              let FdBlackScholesBarrierEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Barrier.IFdBlackScholesBarrierEngine_Factory > ()
              /// ! \ingroup barrierengines
              let FdBlackScholesRebateEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Barrier.IFdBlackScholesRebateEngine_Factory > ()
              /// ! \ingroup barrierengines  \test the correctness of the returned value is tested by reproducing results available in web/literature and comparison with Black pricing.
              let FdHestonBarrierEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Barrier.IFdHestonBarrierEngine_Factory > ()
              /// ! \ingroup barrierengines
              let FdHestonRebateEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Barrier.IFdHestonRebateEngine_Factory > ()
            end

          module Basket =
            begin
              /// 
              let AmericanBasketPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Basket.IAmericanBasketPathPricer_Factory > ()
              /// 
              let EuropeanMultiPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Basket.IEuropeanMultiPathPricer_Factory > ()
              /// ! \ingroup basketengines  \test the correctness of the returned value is tested by reproducing results available in web/literature and comparison with Kirk approximation.
              let Fd2dBlackScholesVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Basket.IFd2dBlackScholesVanillaEngine_Factory > ()
              /// ! This class implements formulae from "Correlation in the Energy Markets", E. Kirk Managing Energy Price Risk. London: Risk Publications and Enron, pp. 71-78  \ingroup basketengines  \test the correctness of the returned value is tested by reproducing results available in literature.
              let KirkEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Basket.IKirkEngine_Factory > ()
              /// ! This class implements formulae from "Options on the Minimum or the Maximum of Two Risky Assets", Rene Stulz, Journal of Financial Ecomomics (1982) 10, 161-185.  \ingroup basketengines  \test the correctness of the returned value is tested by reproducing results available in literature.
              let StulzEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Basket.IStulzEngine_Factory > ()
            end

          module Bond =
            begin
              /// ! See CashFlows for functions' documentation.  These adapters calls into CashFlows functions passing as input the Bond cashflows, the dirty price (i.e. npv) calculated from clean price, the bond settlement date (unless another date is given), zero ex-dividend days, and excluding any cashflow on the settlement date.  Prices are always clean, as per market convention.
              let BondFunctions = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Bond.IBondFunctions_Factory > ()
              /// 
              let DiscountingBondEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Bond.IDiscountingBondEngine_Factory > ()
            end

          module Capfloor =
            begin
              /// ! \ingroup capfloorengines
              let AnalyticCapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Capfloor.IAnalyticCapFloorEngine_Factory > ()
              /// ! \ingroup capfloorengines
              let BlackCapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Capfloor.IBlackCapFloorEngine_Factory > ()
              /// 
              let DiscretizedCapFloor = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Capfloor.IDiscretizedCapFloor_Factory > ()
              /// ! \ingroup capfloorengines
              let TreeCapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Capfloor.ITreeCapFloorEngine_Factory > ()
            end

          module Cliquet =
            begin
              /// ! \ingroup cliquetengines  \test - the correctness of the returned value is tested by reproducing results available in literature. - the correctness of the returned greeks is tested by reproducing numerical derivatives.
              let AnalyticCliquetEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Cliquet.IAnalyticCliquetEngine_Factory > ()
              /// ! \ingroup cliquetengines  \test the correctness of the returned greeks is tested by reproducing numerical derivatives.
              let AnalyticPerformanceEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Cliquet.IAnalyticPerformanceEngine_Factory > ()
              /// 
              let PerformanceOptionPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Cliquet.IPerformanceOptionPathPricer_Factory > ()
            end

          module Credit =
            begin
              /// 
              let IntegralCdsEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Credit.IIntegralCdsEngine_Factory > ()
              /// 
              let MidPointCdsEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Credit.IMidPointCdsEngine_Factory > ()
            end

          module Forward =
            begin
              /// ! as described in Demeterfi, Derman, Kamal & Zou, "A Guide to Volatility and Variance Swaps", 1999  \ingroup forwardengines  \test returned variances verified against results from literature
              let ReplicatingVarianceSwapEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Forward.IReplicatingVarianceSwapEngine_Factory > ()
              /// 
              let VariancePathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Forward.IVariancePathPricer_Factory > ()
            end

          module Inflation =
            begin
              /// ! Unit Displaced Black-formula inflation cap/floor engine (standalone, i.e. no coupon pricer)
              let YoYInflationBachelierCapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Inflation.IYoYInflationBachelierCapFloorEngine_Factory > ()
              /// ! Black-formula inflation cap/floor engine (standalone, i.e. no coupon pricer)
              let YoYInflationBlackCapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Inflation.IYoYInflationBlackCapFloorEngine_Factory > ()
              /// ! This class doesn't know yet what sort of vol it is.  The inflation index must be linked to a yoy inflation term structure.  This provides the curves, hence the call uses a shared_ptr<> not a handle<> to the index.  \ingroup inflationcapfloorengines
              let YoYInflationCapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Inflation.IYoYInflationCapFloorEngine_Factory > ()
              /// ! Unit Displaced Black-formula inflation cap/floor engine (standalone, i.e. no coupon pricer)
              let YoYInflationUnitDisplacedBlackCapFloorEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Inflation.IYoYInflationUnitDisplacedBlackCapFloorEngine_Factory > ()
            end

          module Lookback =
            begin
              /// ! Formula from "Option Pricing Formulas", E.G. Haug, McGraw-Hill, 1998, p.63-64  \ingroup lookbackengines  \test returned values are verified against results from literature
              let AnalyticContinuousFixedLookbackEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Lookback.IAnalyticContinuousFixedLookbackEngine_Factory > ()
              /// ! Formula from "Option Pricing Formulas", E.G. Haug, McGraw-Hill, 1998, p.61-62  \ingroup lookbackengines  \test returned values verified against results from literature
              let AnalyticContinuousFloatingLookbackEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Lookback.IAnalyticContinuousFloatingLookbackEngine_Factory > ()
            end

          module Quanto =
            begin
            end

          module Swap =
            begin
              /// 
              let DiscountingSwapEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Swap.IDiscountingSwapEngine_Factory > ()
              /// 
              let DiscretizedSwap = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Swap.IDiscretizedSwap_Factory > ()
              /// ! \test calculations are checked against known good results
              let TreeVanillaSwapEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Swap.ITreeVanillaSwapEngine_Factory > ()
            end

          module Swaption =
            begin
              /// ! \ingroup swaptionengines  \warning The engine assumes that the exercise date equals the start date of the passed swap.
              let BlackSwaptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Swaption.IBlackSwaptionEngine_Factory > ()
              /// 
              let DiscretizedSwaption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Swaption.IDiscretizedSwaption_Factory > ()
              /// ! \ingroup swaptionengines  \warning The engine assumes that the exercise date equals the start date of the passed swap.
              let JamshidianSwaptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Swaption.IJamshidianSwaptionEngine_Factory > ()
              /// ! \ingroup swaptionengines  \warning This engine is not guaranteed to work if the underlying swap has a start date in the past, i.e., before today's date. When using this engine, prune the initial part of the swap so that it starts at \f$ t \geq 0 \f$.  \test calculations are checked against cached results
              let TreeSwaptionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Swaption.ITreeSwaptionEngine_Factory > ()
            end

          module Vanilla =
            begin
              /// 
              let AmericanPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAmericanPathPricer_Factory > ()
              /// ! References:  Brigo, Mercurio, Interest Rate Models  \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in web/literature
              let AnalyticBSMHullWhiteEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticBSMHullWhiteEngine_Factory > ()
              /// ! \ingroup vanillaengines  \todo add more greeks (as of now only delta and rho available)  \test - the correctness of the returned value in case of cash-or-nothing at-hit digital payoff is tested by reproducing results available in literature. - the correctness of the returned value in case of asset-or-nothing at-hit digital payoff is tested by reproducing results available in literature. - the correctness of the returned value in case of cash-or-nothing at-expiry digital payoff is tested by reproducing results available in literature. - the correctness of the returned value in case of asset-or-nothing at-expiry digital payoff is tested by reproducing results available in literature. - the correctness of the returned greeks in case of cash-or-nothing at-hit digital payoff is tested by reproducing numerical derivatives.
              let AnalyticDigitalAmericanEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticDigitalAmericanEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned greeks is tested by reproducing numerical derivatives.
              let AnalyticDividendEuropeanEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticDividendEuropeanEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test - the correctness of the returned value is tested by reproducing results available in literature. - the correctness of the returned greeks is tested by reproducing results available in literature. - the correctness of the returned greeks is tested by reproducing numerical derivatives. - the correctness of the returned implied volatility is tested by using it for reproducing the target value. - the implied-volatility calculation is tested by checking that it does not modify the option. - the correctness of the returned value in case of cash-or-nothing digital payoff is tested by reproducing results available in literature. - the correctness of the returned value in case of asset-or-nothing digital payoff is tested by reproducing results available in literature. - the correctness of the returned value in case of gap digital payoff is tested by reproducing results available in literature. - the correctness of the returned greeks in case of cash-or-nothing digital payoff is tested by reproducing numerical derivatives.
              let AnalyticEuropeanEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticEuropeanEngine_Factory > ()
              /// ! References:  Jin-Chuan Duan, Genevieve Gauthier, Jean-Guy Simonato, Caroline Sasseville, 2006. Approximating the GJR-GARCH and EGARCH option pricing models analytically Journal of Computational Finance, Volume 9, Number 3, Spring 2006  \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in the Duan et al's 2006 paper.
              let AnalyticGJRGARCHEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticGJRGARCHEngine_Factory > ()
              /// ! References:  Heston, Steven L., 1993. A Closed-Form Solution for Options with Stochastic Volatility with Applications to Bond and Currency Options.  The review of Financial Studies, Volume 6, Issue 2, 327-343.  A. Sepp, Pricing European-Style Options under Jump Diffusion Processes with Stochastic Volatility: Applications of Fourier Transform (<http://math.ut.ee/~spartak/papers/stochjumpvols.pdf>)  R. Lord and C. Kahl, Why the rotation count algorithm works, http://papers.ssrn.com/sol3/papers.cfm?abstract_id=921335  H. Albrecher, P. Mayer, W.Schoutens and J. Tistaert, The Little Heston Trap, http://www.schoutens.be/HestonTrap.pdf  J. Gatheral, The Volatility Surface: A Practitioner's Guide, Wiley Finance  \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in web/literature and comparison with Black pricing.
              let AnalyticHestonEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticHestonEngine_Factory > ()
              /// ! This class is pricing a european options under the following processes  \f[ \begin{array}{rcl} dS(t, S)  &=& (r-d) S dt +\sqrt{v} S dW_1 \\ dv(t, S)  &=& \kappa (\theta - v) dt + \sigma \sqrt{v} dW_2 \\ dr(t)     &=& (\theta(t) - a r) dt + \eta dW_3 \\ dW_1 dW_2 &=& \rho dt \\ dW_1 dW_3 &=& 0 \\ dW_2 dW_3 &=& 0 \\ \end{array} \f]  References:  Karel in't Hout, Joris Bierkens, Antoine von der Ploeg, Joe in't Panhuis, A Semi closed-from analytic pricing formula for call options in a hybrid Heston-Hull-White Model.  A. Sepp, Pricing European-Style Options under Jump Diffusion Processes with Stochastic Volatility: Applications of Fourier Transform (<http://math.ut.ee/~spartak/papers/stochjumpvols.pdf>)  \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in web/literature, testing against QuantLib's analytic Heston and Black-Scholes-Merton Hull-White engine
              let AnalyticHestonHullWhiteEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticHestonHullWhiteEngine_Factory > ()
              /// ! References:  Heston, Steven L., 1993. A Closed-Form Solution for Options with Stochastic Volatility with Applications to Bond and Currency Options.  The review of Financial Studies, Volume 6, Issue 2, 327-343.  J. Gatheral, The Volatility Surface: A Practitioner's Guide, Wiley Finance  A. Elices, Models with time-dependent parameters using transform methods: application to Heston???s model, http://arxiv.org/pdf/0708.2020  \ingroup vanillaengines
              let AnalyticPTDHestonEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IAnalyticPTDHestonEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in literature.
              let BaroneAdesiWhaleyApproximationEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IBaroneAdesiWhaleyApproximationEngine_Factory > ()
              /// 
              let BatesDetJumpEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IBatesDetJumpEngine_Factory > ()
              /// 
              let BatesDoubleExpDetJumpEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IBatesDoubleExpDetJumpEngine_Factory > ()
              /// 
              let BatesDoubleExpEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IBatesDoubleExpEngine_Factory > ()
              /// ! this classes price european options under the following processes  1. Jump-Diffusion with Stochastic Volatility  \f[ \begin{array}{rcl} dS(t, S)  &=& (r-d-\lambda m) S dt +\sqrt{v} S dW_1 + (e^J - 1) S dN \\ dv(t, S)  &=& \kappa (\theta - v) dt + \sigma \sqrt{v} dW_2 \\ dW_1 dW_2 &=& \rho dt \end{array} \f]  N is a Poisson process with the intensity \f$ \lambda \f$. When a jump occurs the magnitude J has the probability density function \f$ \omega(J) \f$.  1.1 Log-Normal Jump Diffusion: BatesEngine  Logarithm of the jump size J is normally distributed \f[ \omega(J) = \frac{1}{\sqrt{2\pi \delta^2}} \exp\left[-\frac{(J-\nu)^2}{2\delta^2}\right] \f]  1.2  Double-Exponential Jump Diffusion: BatesDoubleExpEngine  The jump size has an asymmetric double exponential distribution \f[ \begin{array}{rcl} \omega(J)&=&  p\frac{1}{\eta_u}e^{-\frac{1}{\eta_u}J} 1_{J>0} + q\frac{1}{\eta_d}e^{\frac{1}{\eta_d}J} 1_{J<0} \\ p + q &=& 1 \end{array} \f]  2. Stochastic Volatility with Jump Diffusion and Deterministic Jump Intensity  \f[ \begin{array}{rcl} dS(t, S)  &=& (r-d-\lambda m) S dt +\sqrt{v} S dW_1 + (e^J - 1) S dN \\ dv(t, S)  &=& \kappa (\theta - v) dt + \sigma \sqrt{v} dW_2 \\ d\lambda(t) &=& \kappa_\lambda(\theta_\lambda-\lambda) dt \\ dW_1 dW_2 &=& \rho dt \end{array} \f]  2.1 Log-Normal Jump Diffusion with Deterministic Jump Intensity BatesDetJumpEngine  2.2 Double-Exponential Jump Diffusion with Deterministic Jump Intensity BatesDoubleExpDetJumpEngine   References:  D. Bates, Jumps and stochastic volatility: exchange rate processes implicit in Deutsche mark options, Review of Financial Sudies 9, 69-107.  A. Sepp, Pricing European-Style Options under Jump Diffusion Processes with Stochastic Volatility: Applications of Fourier Transform (<http://math.ut.ee/~spartak/papers/stochjumpvols.pdf>)  \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in web/literature, testing against QuantLib's jump diffusion engine and comparison with Black pricing.
              let BatesEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IBatesEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in literature.
              let BjerksundStenslandApproximationEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IBjerksundStenslandApproximationEngine_Factory > ()
              /// 
              let DigitalPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IDigitalPathPricer_Factory > ()
              /// 
              let DiscretizedVanillaOption = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IDiscretizedVanillaOption_Factory > ()
              /// 
              let EuropeanGJRGARCHPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IEuropeanGJRGARCHPathPricer_Factory > ()
              /// 
              let EuropeanHestonPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IEuropeanHestonPathPricer_Factory > ()
              /// 
              let EuropeanPathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IEuropeanPathPricer_Factory > ()
              /// ! \ingroup vanillaengines
              let FdBatesVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IFdBatesVanillaEngine_Factory > ()
              /// 
              let FdBlackScholesVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IFdBlackScholesVanillaEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in web/literature and comparison with Black/Heston pricing.
              let FdHestonHullWhiteVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IFdHestonHullWhiteVanillaEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in web/literature and comparison with Black pricing.
              let FdHestonVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IFdHestonVanillaEngine_Factory > ()
              /// 
              let FdSimpleBSSwingEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IFdSimpleBSSwingEngine_Factory > ()
              /// ! The name is a misnomer as this is a base class for any finite difference scheme.  Its main job is to handle grid layout.  \ingroup vanillaengines
              let FDVanillaEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IFDVanillaEngine_Factory > ()
              /// 
              let HestonHullWhitePathPricer = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IHestonHullWhitePathPricer_Factory > ()
              /// ! \todo define tolerance for calculate()  \ingroup vanillaengines
              let IntegralEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IIntegralEngine_Factory > ()
              /// ! \ingroup vanillaengines  \test - the correctness of the returned value is tested by reproducing results available in literature. - the correctness of the returned greeks is tested by reproducing numerical derivatives.
              let JumpDiffusionEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IJumpDiffusionEngine_Factory > ()
              /// ! Reference: An Approximate Formula for Pricing American Options, Journal of Derivatives Winter 1999, Ju, N.  \warning Barone-Adesi-Whaley critical commodity price calculation is used, it has not been modified to see whether the method of Ju is faster. Ju does not say how he solves the equation for the critical stock price, e.g. Newton method. He just gives the solution.  The method of BAW gives answers to the same accuracy as in Ju (1999).  \ingroup vanillaengines  \test the correctness of the returned value is tested by reproducing results available in literature.
              let JuQuadraticApproximationEngine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Pricingengines.Vanilla.IJuQuadraticApproximationEngine_Factory > ()
            end
        end

      module Processes =
        begin
          /// ! This class describes the square root stochastic volatility process incl jumps governed by \f[ \begin{array}{rcl} dS(t, S)  &=& (r-d-\lambda m) S dt +\sqrt{v} S dW_1 + (e^J - 1) S dN \\ dv(t, S)  &=& \kappa (\theta - v) dt + \sigma \sqrt{v} dW_2 \\ dW_1 dW_2 &=& \rho dt \\ \omega(J) &=& \frac{1}{\sqrt{2\pi \delta^2}} \exp\left[-\frac{(J-\nu)^2}{2\delta^2}\right] \end{array} \f]  \ingroup processes
          let BatesProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IBatesProcess_Factory > ()
          /// ! This class describes the stochastic process for a forward or futures contract given by \f[ dS(t, S) = \frac{\sigma(t, S)^2}{2} dt + \sigma dW_t. \f]  \ingroup processes
          let BlackProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IBlackProcess_Factory > ()
          /// ! This class describes the stochastic process for a stock or stock index paying a continuous dividend yield given by \f[ dS(t, S) = (r(t) - q(t) - \frac{\sigma(t, S)^2}{2}) dt + \sigma dW_t. \f]  \ingroup processes
          let BlackScholesMertonProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IBlackScholesMertonProcess_Factory > ()
          /// ! This class describes the stochastic process for a stock given by \f[ dS(t, S) = (r(t) - \frac{\sigma(t, S)^2}{2}) dt + \sigma dW_t. \f]  \ingroup processes
          let BlackScholesProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IBlackScholesProcess_Factory > ()
          /// ! \ingroup processes
          let EndEulerDiscretization = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IEndEulerDiscretization_Factory > ()
          /// ! stochastic process whose dynamics are expressed in the forward measure.  \ingroup processes
          let ForwardMeasureProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IForwardMeasureProcess_Factory > ()
          /// ! 1-D stochastic process whose dynamics are expressed in the forward measure.  \ingroup processes
          let ForwardMeasureProcess1D = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IForwardMeasureProcess1D_Factory > ()
          /// ! \ingroup processes
          let G2ForwardProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IG2ForwardProcess_Factory > ()
          /// ! \ingroup processes
          let G2Process = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IG2Process_Factory > ()
          /// ! This class describes the stochastic process for an exchange rate given by \f[ dS(t, S) = (r(t) - r_f(t) - \frac{\sigma(t, S)^2}{2}) dt + \sigma dW_t. \f]  \ingroup processes
          let GarmanKohlagenProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IGarmanKohlagenProcess_Factory > ()
          /// ! This class describes the stochastic process governed by \f[ dS(t, S) = (r(t) - q(t) - \frac{\sigma(t, S)^2}{2}) dt + \sigma dW_t. \f]  \ingroup processes
          let GeneralizedBlackScholesProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IGeneralizedBlackScholesProcess_Factory > ()
          /// ! This class describes the stochastic process governed by \f[ dS(t, S)= \mu S dt + \sigma S dW_t. \f]  \ingroup processes
          let GeometricBrownianMotionProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IGeometricBrownianMotionProcess_Factory > ()
          /// ! This class describes the stochastic volatility process governed by \f[ \begin{array}{rcl} dS(t, S)  &=& \mu S dt + \sqrt{v} S dW_1 \\ dv(t, S)  &=& (\omega + (\beta + \alpha * q_{2} + \gamma * q_{3} - 1) v) dt + (\alpha \sigma_{12} + \gamma \sigma_{13}) v dW_1 + \sqrt{\alpha^{2} (\sigma^{2}_{2} - \sigma^{2}_{12}) + \gamma^{2} (\sigma^{2}_{3} - \sigma^{2}_{13}) + 2 \alpha \gamma (\sigma_{23} - \sigma_{12} \sigma_{13})} v dW_2 \ \ N = normalCDF(\lambda) \\ n &=& \exp{-\lambda^{2}/2} / \sqrt{2 \pi} \\ q_{2} &=& 1 + \lambda^{2} \\ q_{3} &=& \lambda n + N + \lambda^2 N \\ \sigma^{2}_{2} = 2 + 4 \lambda^{4} \\ \sigma^{2}_{3} = \lambda^{3} n + 5 \lambda n + 3N + \lambda^{4} N + 6 \lambda^{2} N -\\lambda^{2} n^{2} - N^{2} - \lambda^{4} N^{2} - 2 \lambda n N - 2 \lambda^{3} nN - 2 \lambda^{2} N^{2} \                 \ \sigma_{12} = -2 \lambda \\ \sigma_{13} = -2 n - 2 \lambda N \\ \sigma_{23} = 2N + \sigma_{12} \sigma_{13} \\ \end{array} \f]  \ingroup processes
          let GJRGARCHProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IGJRGARCHProcess_Factory > ()
          /// ! This class describes the square root stochastic volatility process governed by \f[ \begin{array}{rcl} dS(t, S)  &=& \mu S dt + \sqrt{v} S dW_1 \\ dv(t, S)  &=& \kappa (\theta - v) dt + \sigma \sqrt{v} dW_2 \\ dW_1 dW_2 &=& \rho dt \end{array} \f]  \ingroup processes
          let HestonProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IHestonProcess_Factory > ()
          /// ! \ingroup processes
          let HullWhiteForwardProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IHullWhiteForwardProcess_Factory > ()
          /// ! \ingroup processes
          let HullWhiteProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IHullWhiteProcess_Factory > ()
          /// ! This class implements a three factor Heston Hull-White model  \bug This class was not tested enough to guarantee its functionality... work in progress  \ingroup processes
          let HybridHestonHullWhiteProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IHybridHestonHullWhiteProcess_Factory > ()
          /// 
          let JointStochasticProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IJointStochasticProcess_Factory > ()
          /// ! \ingroup processes
          let Merton76Process = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IMerton76Process_Factory > ()
          /// ! This class describes the Ornstein-Uhlenbeck process governed by \f[ dx = a (r - x_t) dt + \sigma dW_t. \f]  \ingroup processes
          let OrnsteinUhlenbeckProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IOrnsteinUhlenbeckProcess_Factory > ()
          /// ! This class describes a square-root process governed by \f[ dx = a (b - x_t) dt + \sigma \sqrt{x_t} dW_t. \f]  \ingroup processes
          let SquareRootProcess = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.ISquareRootProcess_Factory > ()
          /// ! \ingroup processes
          let StochasticProcessArray = Cephei.Core.FactoryFinder.Find<Cephei.QL.Processes.IStochasticProcessArray_Factory > ()
        end

      module Quotes =
        begin
          /// ! %quote for the Eurodollar-future implied standard deviation
          let EurodollarFuturesImpliedStdDevQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Quotes.IEurodollarFuturesImpliedStdDevQuote_Factory > ()
          /// ! Quote for a forward starting swap
          let ForwardSwapQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Quotes.IForwardSwapQuote_Factory > ()
          /// ! %quote for the forward value of an index
          let ForwardValueQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Quotes.IForwardValueQuote_Factory > ()
          /// ! %quote for the futures-convexity adjustment of an index
          let FuturesConvAdjustmentQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Quotes.IFuturesConvAdjustmentQuote_Factory > ()
          /// ! %quote for the implied standard deviation of an underlying
          let ImpliedStdDevQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Quotes.IImpliedStdDevQuote_Factory > ()
          /// ! Quote adapter for the last fixing available of a given Index
          let LastFixingQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Quotes.ILastFixingQuote_Factory > ()
          /// ! market element returning a stored value
          let SimpleQuote = Cephei.Core.FactoryFinder.Find<Cephei.QL.Quotes.ISimpleQuote_Factory > ()
        end

      module Termstructures =
        begin
          /// ! This abstract class defines the interface of concrete credit structures which will be derived from this one.  \ingroup defaultprobabilitytermstructures
          let DefaultProbabilityTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.IDefaultProbabilityTermStructure_Factory > ()
          /// ! \ingroup inflationtermstructures
          let InflationTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.IInflationTermStructure_Factory > ()
          /// ! This abstract class defines the interface of concrete volatility structures which will be derived from this one.
          let VolatilityTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.IVolatilityTermStructure_Factory > ()
          /// ! This abstract class defines the interface of concrete interest rate structures which will be derived from this one.  \ingroup yieldtermstructures  \test observability against evaluation date changes is checked.
          let YieldTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.IYieldTermStructure_Factory > ()
          /// ! Base class for year-on-year inflation term structures.
          let YoYInflationTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.IYoYInflationTermStructure_Factory > ()
          /// ! Interface for zero inflation term structures. Child classes use templates but do not want that exposed to general users.
          let ZeroInflationTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.IZeroInflationTermStructure_Factory > ()

          module Credit =
            begin
              /// ! Base default-probability bootstrap helper @param tenor  CDS tenor. @param frequency  Coupon frequency. @param settlementDays  The number of days from today's date to the start of the protection period. @param paymentConvention The payment convention applied to coupons schedules, settlement dates and protection period calculations.
              let CdsHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.ICdsHelper_Factory > ()
              /// ! Default-density-curve traits
              let DefaultDensity = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.IDefaultDensity_Factory > ()
              /// ! This abstract class acts as an adapter to DefaultProbabilityTermStructure allowing the programmer to implement only the <tt>defaultDensityImpl(Time)</tt> method in derived classes.  Survival/default probabilities and hazard rates are calculated from default densities.  \ingroup defaultprobabilitytermstructures
              let DefaultDensityStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.IDefaultDensityStructure_Factory > ()
              /// ! \ingroup defaultprobabilitytermstructures
              let FlatHazardRate = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.IFlatHazardRate_Factory > ()
              /// ! Hazard-rate-curve traits
              let HazardRate = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.IHazardRate_Factory > ()
              /// ! This abstract class acts as an adapter to DefaultProbabilityTermStructure allowing the programmer to implement only the <tt>hazardRateImpl(Time)</tt> method in derived classes.  Survival/default probabilities and default densities are calculated from hazard rates.  Hazard rates are defined with annual frequency and continuous compounding.  \ingroup defaultprobabilitytermstructures
              let HazardRateStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.IHazardRateStructure_Factory > ()
              /// ! Spread-quoted CDS hazard rate bootstrap helper.
              let SpreadCdsHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.ISpreadCdsHelper_Factory > ()
              /// ! Survival-Probability-curve traits
              let SurvivalProbability = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.ISurvivalProbability_Factory > ()
              /// ! This abstract class acts as an adapter to DefaultProbabilityTermStructure allowing the programmer to implement only the <tt>survivalProbabilityImpl(Time)</tt> method in derived classes.  Hazard rates and default densities are calculated from survival probabilities.  \ingroup defaultprobabilitytermstructures
              let SurvivalProbabilityStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.ISurvivalProbabilityStructure_Factory > ()
              /// ! Upfront-quoted CDS hazard rate bootstrap helper.
              let UpfrontCdsHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Credit.IUpfrontCdsHelper_Factory > ()
            end

          module Inflation =
            begin
              /// ! Stationary multiplicative seasonality in CPI/RPI/HICP (i.e. in price) implies that zero inflation swap rates are affected, but that year-on-year inflation swap rates show no effect.  Of course, if the seasonality in CPI/RPI/HICP is non-stationary then both swap rates will be affected.  Factors must be in multiples of the minimum required for one year, e.g. 12 for monthly, and these factors are reused for as long as is required, i.e. they wrap around.  So, for example, if 24 factors are given this repeats every two years.  True stationary seasonality can be obtained by giving the same number of factors as the frequency dictates e.g. 12 for monthly seasonality.  \warning Multi-year seasonality (i.e. non-stationary) is fragile: the user <b>must</b> ensure that corrections at whole years before and after the inflation term structure base date are the same.  Otherwise there can be an inconsistency with quoted rates.  This is enforced if the frequency is lower than daily.  This is not enforced for daily seasonality because this will always be inconsistent due to weekends, holidays, leap years, etc.  If you use multi-year daily seasonality it is up to you to check.  \note Factors are normalized relative to their appropriate reference dates.  For zero inflation this is the inflation curve true base date: since you have a fixing for that date the seasonality factor must be one.  For YoY inflation the reference is always one year earlier.  Seasonality is treated as piecewise constant, hence it works correctly with uninterpolated indices if the seasonality correction factor frequency is the same as the index frequency (or less).
              let MultiplicativePriceSeasonality = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Inflation.IMultiplicativePriceSeasonality_Factory > ()
              /// ! This is an abstract class and contains the functions correctXXXRate which returns rates with the seasonality correction.  Currently only the price multiplicative version is implemented, but this covers stationary (1-year) and non-stationary (multi-year) seasonality depending on how many years of factors are given.  Seasonality is piecewise constant, hence it will work with un-interpolated inflation indices.  A seasonality assumption can be used to fill in inflation swap curves between maturities that are usually given in integer numbers of years, e.g. 8,9,10,15,20, etc.  Historical seasonality may be observed in reported CPI values, alternatively it may be affected by known future events, e.g. announced changes in VAT rates.  Thus seasonality may be stationary or non-stationary.  If seasonality is additive then both swap rates will show affects.  Additive seasonality is not implemented.
              let Seasonality = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Inflation.ISeasonality_Factory > ()
              /// ! Year-on-year inflation-swap bootstrap helper
              let YearOnYearInflationSwapHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Inflation.IYearOnYearInflationSwapHelper_Factory > ()
              /// ! Bootstrap traits to use for PiecewiseZeroInflationCurve
              let YoYInflationTraits = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Inflation.IYoYInflationTraits_Factory > ()
              /// ! Zero-coupon inflation-swap bootstrap helper
              let ZeroCouponInflationSwapHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Inflation.IZeroCouponInflationSwapHelper_Factory > ()
              /// ! Bootstrap traits to use for PiecewiseZeroInflationCurve
              let ZeroInflationTraits = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Inflation.IZeroInflationTraits_Factory > ()
            end

          module Volatility =
            begin
              /// 
              let AbcdCalibration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.IAbcdCalibration_Factory > ()
              /// ! \f[ f(T-t) = [ a + b(T-t) ] e^{-c(T-t)} + d \f] following Rebonato's notation.
              let AbcdFunction = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.IAbcdFunction_Factory > ()
              /// Helper class used by unit tests
              let AbcdSquared = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.IAbcdSquared_Factory > ()
              /// 
              let FlatSmileSection = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.IFlatSmileSection_Factory > ()
              /// 
              let SabrInterpolatedSmileSection = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.ISabrInterpolatedSmileSection_Factory > ()
              /// 
              let SabrSmileSection = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.ISabrSmileSection_Factory > ()
              /// ! This abstract class provides volatility smile section interface
              let SmileSection = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.ISmileSection_Factory > ()
              /// 
              let SpreadedSmileSection = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.ISpreadedSmileSection_Factory > ()

              module Capfloor =
                begin
                  /// ! This class is purely abstract and defines the interface of concrete structures which will be derived from this one.
                  let CapFloorTermVolatilityStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Capfloor.ICapFloorTermVolatilityStructure_Factory > ()
                  /// ! This class provides the at-the-money volatility for a given cap/floor interpolating a volatility vector whose elements are the market volatilities of a set of caps/floors with given length.
                  let CapFloorTermVolCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Capfloor.ICapFloorTermVolCurve_Factory > ()
                  /// ! This class provides the volatility for a given cap/floor interpolating a volatility surface whose elements are the market term volatilities of a set of caps/floors with given length and given strike.
                  let CapFloorTermVolSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Capfloor.ICapFloorTermVolSurface_Factory > ()
                  /// ! Constant caplet volatility, no time-strike dependence
                  let ConstantCapFloorTermVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Capfloor.IConstantCapFloorTermVolatility_Factory > ()
                end

              module Equityfx =
                begin
                  /// ! This class implements the BlackVolatilityTermStructure interface for a constant Black volatility (no time/strike dependence).
                  let BlackConstantVol = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.IBlackConstantVol_Factory > ()
                  /// ! This class calculates time-dependent Black volatilities using as input a vector of (ATM) Black volatilities observed in the market.  The calculation is performed interpolating on the variance curve. Linear interpolation is used as default; this can be changed by the setInterpolation() method.  For strike dependence, see BlackVarianceSurface.  \todo check time extrapolation
                  let BlackVarianceCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.IBlackVarianceCurve_Factory > ()
                  /// ! This class calculates time/strike dependent Black volatilities using as input a matrix of Black volatilities observed in the market.  The calculation is performed interpolating on the variance surface.  Bilinear interpolation is used as default; this can be changed by the setInterpolation() method.  \todo check time extrapolation
                  let BlackVarianceSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.IBlackVarianceSurface_Factory > ()
                  /// ! This abstract class acts as an adapter to VolTermStructure allowing the programmer to implement only the <tt>blackVarianceImpl(Time, Real, bool)</tt> method in derived classes.  Volatility are assumed to be expressed on an annual basis.
                  let BlackVarianceTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.IBlackVarianceTermStructure_Factory > ()
                  /// ! This abstract class acts as an adapter to BlackVolTermStructure allowing the programmer to implement only the <tt>blackVolImpl(Time, Real, bool)</tt> method in derived classes.  Volatility are assumed to be expressed on an annual basis.
                  let BlackVolatilityTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.IBlackVolatilityTermStructure_Factory > ()
                  /// ! This abstract class defines the interface of concrete Black-volatility term structures which will be derived from this one.  Volatilities are assumed to be expressed on an annual basis.
                  let BlackVolTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.IBlackVolTermStructure_Factory > ()
                  /// ! The given date will be the implied reference date. \note This term structure will remain linked to the original structure, i.e., any changes in the latter will be reflected in this structure as well.  \warning It doesn't make financial sense to have an asset-dependant implied Vol Term Structure.  This class should be used with term structures that are time dependant only.
                  let ImpliedVolTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.IImpliedVolTermStructure_Factory > ()
                  /// ! This class implements the LocalVolatilityTermStructure interface for a constant local volatility (no time/asset dependence).  Local volatility and Black volatility are the same when volatility is at most time dependent, so this class is basically a proxy for BlackVolatilityTermStructure.
                  let LocalConstantVol = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.ILocalConstantVol_Factory > ()
                  /// ! Local volatility curve derived from a Black curve
                  let LocalVolCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.ILocalVolCurve_Factory > ()
                  /// ! For details about this implementation refer to "Stochastic Volatility and Local Volatility," in "Case Studies and Financial Modelling Course Notes," by Jim Gatheral, Fall Term, 2003  see www.math.nyu.edu/fellows_fin_math/gatheral/Lecture1_Fall02.pdf  \bug this class is untested, probably unreliable.
                  let LocalVolSurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.ILocalVolSurface_Factory > ()
                  /// ! This abstract class defines the interface of concrete local-volatility term structures which will be derived from this one.  Volatilities are assumed to be expressed on an annual basis.
                  let LocalVolTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Equityfx.ILocalVolTermStructure_Factory > ()
                end

              module Inflation =
                begin
                  /// ! Constant surface, no K or T dependence.
                  let ConstantCPIVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Inflation.IConstantCPIVolatility_Factory > ()
                  /// ! Constant surface, no K or T dependence.
                  let ConstantYoYOptionletVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Inflation.IConstantYoYOptionletVolatility_Factory > ()
                  /// ! Abstract interface. CPI volatility is always with respect to some base date.  Also deal with lagged observations of an index with a (usually different) availability lag.
                  let CPIVolatilitySurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Inflation.ICPIVolatilitySurface_Factory > ()
                  /// ! Abstract interface ... no data, only results.  Basically used to change the BlackVariance() methods to totalVariance. Also deal with lagged observations of an index with a (usually different) availability lag.
                  let YoYOptionletVolatilitySurface = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Inflation.IYoYOptionletVolatilitySurface_Factory > ()
                end

              module Optionlet =
                begin
                  /// ! \deprecated use the StrippedOptionletAdapter of a StrippedOptionlet instance
                  let CapletVarianceCurve = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.ICapletVarianceCurve_Factory > ()
                  /// ! Constant caplet volatility, no time-strike dependence
                  let ConstantOptionletVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IConstantOptionletVolatility_Factory > ()
                  /// ! StrippedOptionletBase specialization. It's up to derived classes to implement LazyObject::performCalculations
                  let OptionletStripper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IOptionletStripper_Factory > ()
                  /// ! Helper class to strip optionlet (i.e. caplet/floorlet) volatilities (a.k.a. forward-forward volatilities) from the (cap/floor) term volatilities of a CapFloorTermVolSurface.
                  let OptionletStripper1 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IOptionletStripper1_Factory > ()
                  /// ! Helper class to extend an OptionletStripper1 object stripping additional optionlet (i.e. caplet/floorlet) volatilities (a.k.a. forward-forward volatilities) from the (cap/floor) At-The-Money term volatilities of a CapFloorTermVolCurve.
                  let OptionletStripper2 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IOptionletStripper2_Factory > ()
                  /// ! This class is purely abstract and defines the interface of concrete structures which will be derived from this one.
                  let OptionletVolatilityStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IOptionletVolatilityStructure_Factory > ()
                  /// 
                  let SpreadedOptionletVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.ISpreadedOptionletVolatility_Factory > ()
                  /// ! Helper class to wrap in a StrippedOptionletBase object a matrix of exogenously calculated optionlet (i.e. caplet/floorlet) volatilities (a.k.a. forward-forward volatilities).
                  let StrippedOptionlet = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IStrippedOptionlet_Factory > ()
                  /// ! Adapter class for turning a StrippedOptionletBase object into an OptionletVolatilityStructure.
                  let StrippedOptionletAdapter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IStrippedOptionletAdapter_Factory > ()
                  /// ! Abstract base class interface for a (time indexed) vector of (strike indexed) optionlet (i.e. caplet/floorlet) volatilities.
                  let StrippedOptionletBase = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Optionlet.IStrippedOptionletBase_Factory > ()
                end

              module Swaption =
                begin
                  /// ! set of CMS quotes
                  let CmsMarket = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ICmsMarket_Factory > ()
                  /// 
                  let CmsMarketCalibration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ICmsMarketCalibration_Factory > ()
                  /// ! Constant swaption volatility, no time-strike dependence
                  let ConstantSwaptionVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.IConstantSwaptionVolatility_Factory > ()
                  /// 
                  let SpreadedSwaptionVolatility = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ISpreadedSwaptionVolatility_Factory > ()
                  /// ! \warning this class is not finalized and its interface might change in subsequent releases.
                  let SwaptionVolatilityCube = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ISwaptionVolatilityCube_Factory > ()
                  /// 
                  let SwaptionVolatilityDiscrete = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ISwaptionVolatilityDiscrete_Factory > ()
                  /// ! This class provides the at-the-money volatility for a given swaption by interpolating a volatility matrix whose elements are the market volatilities of a set of swaption with given option date and swapLength.  The volatility matrix <tt>M</tt> must be defined so that: - the number of rows equals the number of option dates; - the number of columns equals the number of swap tenors; - <tt>M[i][j]</tt> contains the volatility corresponding to the <tt>i</tt>-th option and <tt>j</tt>-th tenor.
                  let SwaptionVolatilityMatrix = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ISwaptionVolatilityMatrix_Factory > ()
                  /// 
                  let SwaptionVolCube1 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ISwaptionVolCube1_Factory > ()
                  /// 
                  let SwaptionVolCube2 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Volatility.Swaption.ISwaptionVolCube2_Factory > ()
                end
            end

          module Yield =
            begin
              /// ! Rate helper for bootstrapping over BMA swap rates
              let BMASwapRateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IBMASwapRateHelper_Factory > ()
              /// ! \warning This class assumes that the reference date does not change between calls of setTermStructure().
              let BondHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IBondHelper_Factory > ()
              /// ! Fits a discount function to a set of cubic B-splines \f$ N_{i,3}(t) \f$, i.e., \f[ d(t) = \sum_{i=0}^{n}  c_i * N_{i,3}(t) \f]  See: McCulloch, J. 1971, "Measuring the Term Structure of Interest Rates." Journal of Business, 44: 19-31  McCulloch, J. 1975, "The tax adjusted yield curve." Journal of Finance, XXX811-30  \warning "The results are extremely sensitive to the number and location of the knot points, and there is no optimal way of selecting them." James, J. and N. Webber, "Interest Rate Modelling" John Wiley, 2000, pp. 440.
              let CubicBSplinesFitting = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.ICubicBSplinesFitting_Factory > ()
              /// ! Rate helper for bootstrapping over Overnight Indexed Swap rates
              let DatedOISRateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IDatedOISRateHelper_Factory > ()
              /// ! Rate helper for bootstrapping over deposit rates
              let DepositRateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IDepositRateHelper_Factory > ()
              /// ! Drift term structure for modelling the common drift term: riskFreeRate - dividendYield - 0.5*vol*vol  \note This term structure will remain linked to the original structures, i.e., any changes in the latters will be reflected in this structure as well.
              let DriftTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IDriftTermStructure_Factory > ()
              /// ! Fits a discount function to the exponential form \f[ d(t) = \sum_{i=1}^9 c_i \exp^{-kappa i t} \f] where the constants \f$ c_i \f$ and \f$ \kappa \f$ are to be determined.  See:Li, B., E. DeWetering, G. Lucas, R. Brenner and A. Shapiro (2001): "Merrill Lynch Exponential Spline Model." Merrill Lynch Working Paper  \warning convergence may be slow
              let ExponentialSplinesFitting = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IExponentialSplinesFitting_Factory > ()
              /// ! \warning This class assumes that the reference date does not change between calls of setTermStructure().
              let FixedRateBondHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IFixedRateBondHelper_Factory > ()
              /// ! \ingroup yieldtermstructures
              let FlatForward = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IFlatForward_Factory > ()
              /// ! Forward-curve traits
              let ForwardRate = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IForwardRate_Factory > ()
              /// ! This abstract class acts as an adapter to YieldTermStructure allowing the programmer to implement only the &lt;tt&gt;forwardImpl(Time)&lt;/tt&gt; method in derived classes.  Zero yields and discounts are calculated from forwards. Forward rates are assumed to be annual continuous compounding.  \ingroup yieldtermstructures
              let ForwardRateStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IForwardRateStructure_Factory > ()
              /// ! \note This term structure will remain linked to the original structure, i.e., any changes in the latter will be reflected in this structure as well.  \ingroup yieldtermstructures  \test - the correctness of the returned values is tested by checking them against numerical calculations. - observability against changes in the underlying term structure and in the added spread is checked.
              let ForwardSpreadedTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IForwardSpreadedTermStructure_Factory > ()
              /// ! Rate helper for bootstrapping over %FRA rates
              let FraRateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IFraRateHelper_Factory > ()
              /// ! Rate helper for bootstrapping over IborIndex futures prices
              let FuturesRateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IFuturesRateHelper_Factory > ()
              /// ! The given date will be the implied reference date.  \note This term structure will remain linked to the original structure, i.e., any changes in the latter will be reflected in this structure as well.  \ingroup yieldtermstructures  \test - the correctness of the returned values is tested by checking them against numerical calculations. - observability against changes in the underlying term structure is checked.
              let ImpliedTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IImpliedTermStructure_Factory > ()
              /// ! Fits a discount function to the form \f$ d(t) = \exp^{-r t}, \f$ where the zero rate \f$r\f$ is defined as \f[ r \equiv c_0 + (c_0 + c_1)*(1 - exp^{-\kappa*t}/(\kappa t) - c_2 exp^{ - \kappa t}. \f] See: Nelson, C. and A. Siegel (1985): "Parsimonious modeling of yield curves for US Treasury bills." NBER Working Paper Series, no 1594.
              let NelsonSiegelFitting = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.INelsonSiegelFitting_Factory > ()
              /// ! Rate helper for bootstrapping over Overnight Indexed Swap rates
              let OISRateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IOISRateHelper_Factory > ()
              /// PiecewiseYieldCurveDiscountLogLinear is a DLL marshalable version of PiecewiseYieldCurve<Discount,LogLinear>, designed to be marshalled from F#/C# <font color="green">ASC091208</font>
              let PiecewiseYieldCurveDiscountLogLinear = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IPiecewiseYieldCurveDiscountLogLinear_Factory > ()
              /// PiecewiseYieldCurveForwardRateLogLinear is a DLL marshalable version of PiecewiseYieldCurve<ForwardRate,LogLinear>, designed to be marshalled from F#/C# <font color="green">ASC091208</font>
              let PiecewiseYieldCurveForwardRateLogLinear = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IPiecewiseYieldCurveForwardRateLogLinear_Factory > ()
              /// PiecewiseYieldCurveZeroYieldLogLinear is a DLL marshalable version of PiecewiseYieldCurve<ZeroYield,LogLinear>, designed to be marshalled from F#/C# <font color="green">ASC091208</font>
              let PiecewiseYieldCurveZeroYieldLogLinear = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IPiecewiseYieldCurveZeroYieldLogLinear_Factory > ()
              /// ! The zero-yield spread at any given date is linearly interpolated between the input data.  \note This term structure will remain linked to the original structure, i.e., any changes in the latter will be reflected in this structure as well.  \ingroup yieldtermstructures
              let PiecewiseZeroSpreadedTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IPiecewiseZeroSpreadedTermStructure_Factory > ()
              /// ! Quanto term structure for modelling quanto effect in option pricing.  \note This term structure will remain linked to the original structures, i.e., any changes in the latters will be reflected in this structure as well.
              let QuantoTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IQuantoTermStructure_Factory > ()
              /// ASC091208 Change RateHelper from a typedef to a class to allow export accross DLL boundary typedef BootstrapHelper&lt;YieldTermStructure&gt; RateHelper;
              let RateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IRateHelper_Factory > ()
              /// Fits a discount function to the simple polynomial form: \f[ d(t) = \sum_{i=0}^{degree}  c_i * t^{i} \f] where the constants \f$ c_i \f$ are to be determined.  This is a simple/crude, but fast and robust, means of fitting a yield curve.
              let SimplePolynomialFitting = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.ISimplePolynomialFitting_Factory > ()
              /// ! Fits a discount function to the form \f$ d(t) = \exp^{-r t}, \f$ where the zero rate \f$r\f$ is defined as \f[ r \equiv c_0 + (c_0 + c_1)(\frac {1 - exp^{-\kappa t}}{\kappa t}) - c_2exp^{ - \kappa t} + c_3{(\frac{1 - exp^{-\kappa_1 t}}{\kappa_1 t} -exp^{-\kappa_1 t})}. \f] See: Svensson, L. (1994). Estimating and interpreting forward interest rates: Sweden 1992-4. Discussion paper, Centre for Economic Policy Research(1051).
              let SvenssonFitting = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.ISvenssonFitting_Factory > ()
              /// ! \todo use input SwapIndex to create the swap
              let SwapRateHelper = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.ISwapRateHelper_Factory > ()
              /// ! \note This term structure will remain linked to the original structure, i.e., any changes in the latter will be reflected in this structure as well.  \ingroup yieldtermstructures  \test - the correctness of the returned values is tested by checking them against numerical calculations. - observability against changes in the underlying term structure and in the added spread is checked.
              let ZeroSpreadedTermStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IZeroSpreadedTermStructure_Factory > ()
              /// ! Zero-curve traits
              let ZeroYield = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IZeroYield_Factory > ()
              /// ! This abstract class acts as an adapter to YieldTermStructure allowing the programmer to implement only the &lt;tt&gt;zeroYieldImpl(Time)&lt;/tt&gt; method in derived classes.  Discount and forward are calculated from zero yields.  Zero rates are assumed to be annual continuous compounding.  \ingroup yieldtermstructures
              let ZeroYieldStructure = Cephei.Core.FactoryFinder.Find<Cephei.QL.Termstructures.Yield.IZeroYieldStructure_Factory > ()
            end
        end

      module Time =
        begin

          module Calendars =
            begin
              /// ! Public holidays (see <http://www.cbr.ru/eng/>:): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year holidays and Christmas, January 1st to 8th</li> <li>Defender of the Fatherland Day, February 23rd (possibly moved to Monday)</li> <li>International Women's Day, March 8th (possibly moved to Monday)</li> <li>Labour Day, May 1st (possibly moved to Monday)</li> <li>Victory Day, May 9th (possibly moved to Monday)</li> <li>Russia Day, June 12th (possibly moved to Monday)</li> <li>Unity Day, November 4th (possibly moved to Monday)</li> </ul>  \ingroup calendars
              let Russia = Cephei.Core.FactoryFinder.Find<Cephei.QL.Time.Calendars.IRussia_Factory > ()
            end

          module Daycounters =
            begin
            end
        end

      module Times =
        begin
          /// ! This class provides methods for determining whether a date is a business day or a holiday for a given market, and for incrementing/decrementing a date of a given number of business days.  The Bridge pattern is used to provide the base behavior of the calendar, namely, to determine whether a date is a business day.  A calendar should be defined for specific exchange holiday schedule or for general country holiday schedule. Legacy city holiday schedule calendars will be moved to the exchange/country convention.  \ingroup datetime  \test the methods for adding and removing holidays are tested by inspecting the calendar before and after their invocation.
          let Calendar = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.ICalendar_Factory > ()
          /// ! This class provides methods to inspect dates as well as methods and operators which implement a limited date algebra (increasing and decreasing dates, and calculating their difference).  \ingroup datetime  \test self-consistency of dates, serial numbers, days of month, months, and weekdays is checked over the whole date range.
          let Date = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.IDate_Factory > ()
          /// ! These conventions specify the rule used to generate dates in a Schedule.  \ingroup datetime
          let DateGeneration = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.IDateGeneration_Factory > ()
          /// ! This class provides methods for determining the length of a time period according to given market convention, both as a number of days and as a year fraction.  The Bridge pattern is used to provide the base behavior of the day counter.  \ingroup datetime
          let DayCounter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.IDayCounter_Factory > ()
          /// ! European Central Bank reserve maintenance dates
          let ECB = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.IECB_Factory > ()
          /// ! Main cycle of the International %Money Market (a.k.a. %IMM) months
          let IMM = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.IIMM_Factory > ()
          /// ! This class provides a more comfortable interface to the argument list of Schedule's constructor.
          let MakeSchedule = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.IMakeSchedule_Factory > ()
          /// ! This class provides a Period (length + TimeUnit) class and implements a limited algebra.  \ingroup datetime  \test self-consistency of algebra is checked.
          let Period = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.IPeriod_Factory > ()
          /// ! \ingroup datetime
          let Schedule = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.ISchedule_Factory > ()

          module Calendars =
            begin
              /// ! Holidays for the Buenos Aires stock exchange (data from <http://www.merval.sba.com.ar/>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Holy Thursday</li> <li>Good Friday</li> <li>Labour Day, May 1st</li> <li>May Revolution, May 25th</li> <li>Death of General Manuel Belgrano, third Monday of June</li> <li>Independence Day, July 9th</li> <li>Death of General Jos? de San Mart?n, third Monday of August</li> <li>Columbus Day, October 12th (moved to preceding Monday if on Tuesday or Wednesday and to following if on Thursday or Friday)</li> <li>Immaculate Conception, December 8th</li> <li>Christmas Eve, December 24th</li> <li>New Year's Eve, December 31th</li> </ul>  \ingroup calendars
              let Argentina = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IArgentina_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Australia Day, January 26th (possibly moved to Monday)</li> <li>Good Friday</li> <li>Easter Monday</li> <li>ANZAC Day. April 25th (possibly moved to Monday)</li> <li>Queen's Birthday, second Monday in June</li> <li>Bank Holiday, first Monday in August</li> <li>Labour Day, first Monday in October</li> <li>Christmas, December 25th (possibly moved to Monday or Tuesday)</li> <li>Boxing Day, December 26th (possibly moved to Monday or Tuesday)</li> </ul>  \ingroup calendars
              let Australia = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IAustralia_Factory > ()
              /// ! This calendar has no predefined set of business days. Holidays and weekdays can be defined by means of the provided interface. Instances constructed by copying remain linked to the original one; adding a new holiday or weekday will affect all linked instances.  \ingroup calendars
              let BespokeCalendar = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IBespokeCalendar_Factory > ()
              /// ! Banking holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Tiradentes's Day, April 21th</li> <li>Labour Day, May 1st</li> <li>Independence Day, September 7th</li> <li>Nossa Sra. Aparecida Day, October 12th</li> <li>All Souls Day, November 2nd</li> <li>Republic Day, November 15th</li> <li>Christmas, December 25th</li> <li>Passion of Christ</li> <li>Carnival</li> <li>Corpus Christi</li> </ul>  Holidays for the Bovespa stock exchange <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Sao Paulo City Day, January 25th</li> <li>Tiradentes's Day, April 21th</li> <li>Labour Day, May 1st</li> <li>Revolution Day, July 9th</li> <li>Independence Day, September 7th</li> <li>Nossa Sra. Aparecida Day, October 12th</li> <li>All Souls Day, November 2nd</li> <li>Republic Day, November 15th</li> <li>Black Consciousness Day, November 20th (since 2007)</li> <li>Christmas, December 25th</li> <li>Passion of Christ</li> <li>Carnival</li> <li>Corpus Christi</li> <li>the last business day of the year</li> </ul>  \ingroup calendars  \test the correctness of the returned results is tested against a list of known holidays.
              let Brazil = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IBrazil_Factory > ()
              /// ! Banking holidays (data from <http://www.bankofcanada.ca/en/about/holiday.html>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Family Day, third Monday of February (since 2008)</li> <li>Good Friday</li> <li>Victoria Day, the Monday on or preceding May 24th</li> <li>Canada Day, July 1st (possibly moved to Monday)</li> <li>Provincial Holiday, first Monday of August</li> <li>Labour Day, first Monday of September</li> <li>Thanksgiving Day, second Monday of October</li> <li>Remembrance Day, November 11th (possibly moved to Monday)</li> <li>Christmas, December 25th (possibly moved to Monday or Tuesday)</li> <li>Boxing Day, December 26th (possibly moved to Monday or Tuesday)</li> </ul>  Holidays for the Toronto stock exchange (data from <http://www.tsx.com/en/about_tsx/market_hours.html>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Family Day, third Monday of February (since 2008)</li> <li>Good Friday</li> <li>Victoria Day, the Monday on or preceding May 24th</li> <li>Canada Day, July 1st (possibly moved to Monday)</li> <li>Provincial Holiday, first Monday of August</li> <li>Labour Day, first Monday of September</li> <li>Thanksgiving Day, second Monday of October</li> <li>Christmas, December 25th (possibly moved to Monday or Tuesday)</li> <li>Boxing Day, December 26th (possibly moved to Monday or Tuesday)</li> </ul>  \ingroup calendars
              let Canada = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ICanada_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's day, January 1st (possibly followed by one or two more holidays)</li> <li>Labour Day, first week in May</li> <li>National Day, one week from October 1st</li> </ul>  Other holidays for which no rule is given (data available for 2004-2011 only): <ul> <li>Chinese New Year</li> <li>Ching Ming Festival</li> <li>Tuen Ng Festival</li> <li>Mid-Autumn Festival</li> </ul>  Data from <http://www.sse.com.cn/sseportal/en/home/home.shtml>  \ingroup calendars
              let China = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IChina_Factory > ()
              /// ! Holidays for the Prague stock exchange (see http://www.pse.cz/): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Easter Monday</li> <li>Labour Day, May 1st</li> <li>Liberation Day, May 8th</li> <li>SS. Cyril and Methodius, July 5th</li> <li>Jan Hus Day, July 6th</li> <li>Czech Statehood Day, September 28th</li> <li>Independence Day, October 28th</li> <li>Struggle for Freedom and Democracy Day, November 17th</li> <li>Christmas Eve, December 24th</li> <li>Christmas, December 25th</li> <li>St. Stephen, December 26th</li> </ul>  \ingroup calendars
              let CzechRepublic = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ICzechRepublic_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>Maunday Thursday</li> <li>Good Friday</li> <li>Easter Monday</li> <li>General Prayer Day, 25 days after Easter Monday</li> <li>Ascension</li> <li>Whit (Pentecost) Monday </li> <li>New Year's Day, January 1st</li> <li>Constitution Day, June 5th</li> <li>Christmas, December 25th</li> <li>Boxing Day, December 26th</li> </ul>  \ingroup calendars
              let Denmark = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IDenmark_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Epiphany, January 6th</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Ascension Thursday</li> <li>Labour Day, May 1st</li> <li>Midsummer Eve (Friday between June 18-24)</li> <li>Independence Day, December 6th</li> <li>Christmas Eve, December 24th</li> <li>Christmas, December 25th</li> <li>Boxing Day, December 26th</li> </ul>  \ingroup calendars
              let Finland = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IFinland_Factory > ()
              /// ! Public holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Ascension Thursday</li> <li>Whit Monday</li> <li>Corpus Christi</li> <li>Labour Day, May 1st</li> <li>National Day, October 3rd</li> <li>Christmas Eve, December 24th</li> <li>Christmas, December 25th</li> <li>Boxing Day, December 26th</li> <li>New Year's Eve, December 31st</li> </ul>  Holidays for the Frankfurt Stock exchange (data from http://deutsche-boerse.com/): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Labour Day, May 1st</li> <li>Christmas' Eve, December 24th</li> <li>Christmas, December 25th</li> <li>Christmas Holiday, December 26th</li> <li>New Year's Eve, December 31st</li> </ul>  Holidays for the Xetra exchange (data from http://deutsche-boerse.com/): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Labour Day, May 1st</li> <li>Christmas' Eve, December 24th</li> <li>Christmas, December 25th</li> <li>Christmas Holiday, December 26th</li> <li>New Year's Eve, December 31st</li> </ul>  Holidays for the Eurex exchange (data from http://www.eurexchange.com/index.html): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Labour Day, May 1st</li> <li>Christmas' Eve, December 24th</li> <li>Christmas, December 25th</li> <li>Christmas Holiday, December 26th</li> <li>New Year's Eve, December 31st</li> </ul>  Holidays for the Euwax exchange (data from http://www.boerse-stuttgart.de): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Labour Day, May 1st</li> <li>Whit Monday</li> <li>Christmas' Eve, December 24th</li> <li>Christmas, December 25th</li> <li>Christmas Holiday, December 26th</li> <li>New Year's Eve, December 31st</li> </ul>  \ingroup calendars  \test the correctness of the returned results is tested against a list of known holidays.
              let Germany = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IGermany_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Ching Ming Festival, April 5th </li> <li>Good Friday</li> <li>Easter Monday</li> <li>Labor Day, May 1st (possibly moved to Monday)</li> <li>SAR Establishment Day, July 1st (possibly moved to Monday)</li> <li>National Day, October 1st (possibly moved to Monday)</li> <li>Christmas, December 25th</li> <li>Boxing Day, December 26th</li> </ul>  Other holidays for which no rule is given (data available for 2004-2012 only:) <ul> <li>Lunar New Year</li> <li>Chinese New Year</li> <li>Buddha's birthday</li> <li>Tuen NG Festival</li> <li>Mid-autumn Festival</li> <li>Chung Yeung Festival</li> </ul>  Data from <http://www.hkex.com.hk>  \ingroup calendars
              let HongKong = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IHongKong_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>Easter Monday</li> <li>Whit(Pentecost) Monday </li> <li>New Year's Day, January 1st</li> <li>National Day, March 15th</li> <li>Labour Day, May 1st</li> <li>Constitution Day, August 20th</li> <li>Republic Day, October 23rd</li> <li>All Saints Day, November 1st</li> <li>Christmas, December 25th</li> <li>2nd Day of Christmas, December 26th</li> </ul>  \ingroup calendars
              let Hungary = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IHungary_Factory > ()
              /// ! Holidays for the Iceland stock exchange (data from <http://www.icex.is/is/calendar?languageID=1>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Holy Thursday</li> <li>Good Friday</li> <li>Easter Monday</li> <li>First day of Summer (third or fourth Thursday in April)</li> <li>Labour Day, May 1st</li> <li>Ascension Thursday</li> <li>Pentecost Monday</li> <li>Independence Day, June 17th</li> <li>Commerce Day, first Monday in August</li> <li>Christmas, December 25th</li> <li>Boxing Day, December 26th</li> </ul>  \ingroup calendars
              let Iceland = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IIceland_Factory > ()
              /// ! Holidays for the National Stock Exchange (data from <http://www.nse-india.com/>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>Republic Day, January 26th</li> <li>Good Friday</li> <li>Ambedkar Jayanti, April 14th</li> <li>Independence Day, August 15th</li> <li>Gandhi Jayanti, October 2nd</li> <li>Christmas, December 25th</li> </ul>  Other holidays for which no rule is given (data available for 2005-2011 only:) <ul> <li>Bakri Id</li> <li>Moharram</li> <li>Mahashivratri</li> <li>Holi</li> <li>Ram Navami</li> <li>Mahavir Jayanti</li> <li>Id-E-Milad</li> <li>Maharashtra Day</li> <li>Buddha Pournima</li> <li>Ganesh Chaturthi</li> <li>Dasara</li> <li>Laxmi Puja</li> <li>Bhaubeej</li> <li>Ramzan Id</li> <li>Guru Nanak Jayanti</li> </ul>  \ingroup calendars
              let India = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IIndia_Factory > ()
              /// ! Holidays for the Indonesia stock exchange (data from <http://www.idx.co.id/>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday</li> <li>Ascension of Jesus Christ</li> <li>Independence Day, August 17th</li> <li>Christmas, December 25th</li> </ul>  Other holidays for which no rule is given (data available for 2005-2011 only:) <ul> <li>Idul Adha</li> <li>Ied Adha</li> <li>Imlek</li> <li>Moslem's New Year Day</li> <li>Chinese New Year</li> <li>Nyepi (Saka's New Year)</li> <li>Birthday of Prophet Muhammad SAW</li> <li>Waisak</li> <li>Ascension of Prophet Muhammad SAW</li> <li>Idul Fitri</li> <li>Ied Fitri</li> <li>Other national leaves</li> </ul> \ingroup calendars
              let Indonesia = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IIndonesia_Factory > ()
              /// ! Public holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Epiphany, January 6th</li> <li>Easter Monday</li> <li>Liberation Day, April 25th</li> <li>Labour Day, May 1st</li> <li>Republic Day, June 2nd (since 2000)</li> <li>Assumption, August 15th</li> <li>All Saint's Day, November 1st</li> <li>Immaculate Conception Day, December 8th</li> <li>Christmas Day, December 25th</li> <li>St. Stephen's Day, December 26th</li> </ul>  Holidays for the stock exchange (data from http://www.borsaitalia.it): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Labour Day, May 1st</li> <li>Assumption, August 15th</li> <li>Christmas' Eve, December 24th</li> <li>Christmas, December 25th</li> <li>St. Stephen, December 26th</li> <li>New Year's Eve, December 31st</li> </ul>  \ingroup calendars  \test the correctness of the returned results is tested against a list of known holidays.
              let Italy = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IItaly_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Bank Holiday, January 2nd</li> <li>Bank Holiday, January 3rd</li> <li>Coming of Age Day, 2nd Monday in January</li> <li>National Foundation Day, February 11th</li> <li>Vernal Equinox</li> <li>Greenery Day, April 29th</li> <li>Constitution Memorial Day, May 3rd</li> <li>Holiday for a Nation, May 4th</li> <li>Children's Day, May 5th</li> <li>Marine Day, 3rd Monday in July</li> <li>Respect for the Aged Day, 3rd Monday in September</li> <li>Autumnal Equinox</li> <li>Health and Sports Day, 2nd Monday in October</li> <li>National Culture Day, November 3rd</li> <li>Labor Thanksgiving Day, November 23rd</li> <li>Emperor's Birthday, December 23rd</li> <li>Bank Holiday, December 31st</li> <li>a few one-shot holidays</li> </ul> Holidays falling on a Sunday are observed on the Monday following except for the bank holidays associated with the new year.  \ingroup calendars
              let Japan = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IJapan_Factory > ()
              /// ! Depending on the chosen rule, this calendar has a set of business days given by either the union or the intersection of the sets of business days of the given calendars.  \ingroup calendars  \test the correctness of the returned results is tested by reproducing the calculations.
              let JointCalendar = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IJointCalendar_Factory > ()
              /// ! Holidays for the Mexican stock exchange (data from <http://www.bmv.com.mx/>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Constitution Day, February 5th</li> <li>Birthday of Benito Juarez, March 21st</li> <li>Holy Thursday</li> <li>Good Friday</li> <li>Labour Day, May 1st</li> <li>National Day, September 16th</li> <li>Our Lady of Guadalupe, December 12th</li> <li>Christmas, December 25th</li> </ul>  \ingroup calendars
              let Mexico = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IMexico_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday or Tuesday)</li> <li>Day after New Year's Day, January 2st (possibly moved to Monday or Tuesday)</li> <li>Anniversary Day, Monday nearest January 22nd</li> <li>Waitangi Day. February 6th</li> <li>Good Friday</li> <li>Easter Monday</li> <li>ANZAC Day. April 25th</li> <li>Queen's Birthday, first Monday in June</li> <li>Labour Day, fourth Monday in October</li> <li>Christmas, December 25th (possibly moved to Monday or Tuesday)</li> <li>Boxing Day, December 26th (possibly moved to Monday or Tuesday)</li> </ul> \note The holiday rules for New Zealand were documented by David Gilbert for IDB (http://www.jrefinery.com/ibd/)  \ingroup calendars
              let NewZealand = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.INewZealand_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>Holy Thursday</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Ascension</li> <li>Whit(Pentecost) Monday </li> <li>New Year's Day, January 1st</li> <li>May Day, May 1st</li> <li>National Independence Day, May 17st</li> <li>Christmas, December 25th</li> <li>Boxing Day, December 26th</li> </ul>  \ingroup calendars
              let Norway = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.INorway_Factory > ()
              /// ! This calendar has no holidays. It ensures that dates at whole-month distances have the same day of month.  \ingroup calendars
              let NullCalendar = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.INullCalendar_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>Easter Monday</li> <li>Corpus Christi</li> <li>New Year's Day, January 1st</li> <li>May Day, May 1st</li> <li>Constitution Day, May 3rd</li> <li>Assumption of the Blessed Virgin Mary, August 15th</li> <li>All Saints Day, November 1st</li> <li>Independence Day, November 11th</li> <li>Christmas, December 25th</li> <li>2nd Day of Christmas, December 26th</li> </ul>  \ingroup calendars
              let Poland = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IPoland_Factory > ()
              /// ! Holidays for the Tadawul financial market (data from <http://www.tadawul.com.sa>): <ul> <li>Thursdays</li> <li>Fridays</li> <li>National Day of Saudi Arabia, September 23rd</li> </ul>  Other holidays for which no rule is given (data available sparsely for 2004-2011 only:) <ul> <li>Eid Al-Adha</li> <li>Eid Al-Fitr</li> </ul>  \ingroup calendars
              let SaudiArabia = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ISaudiArabia_Factory > ()
              /// ! Holidays for the Singapore exchange (data from <http://www.simex.com.sg>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's day, January 1st</li> <li>Good Friday</li> <li>Labour Day, May 1st</li> <li>National Day, August 9th</li> <li>Christmas, December 25th </li> </ul>  Other holidays for which no rule is given (data available for 2004-2010 only:) <ul> <li>Chinese New Year</li> <li>Hari Raya Haji</li> <li>Vesak Poya Day</li> <li>Deepavali</li> <li>Diwali</li> <li>Hari Raya Puasa</li> </ul>  \ingroup calendars
              let Singapore = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ISingapore_Factory > ()
              /// ! Holidays for the Bratislava stock exchange (data from <http://www.bsse.sk/>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Epiphany, January 6th</li> <li>Good Friday</li> <li>Easter Monday</li> <li>May Day, May 1st</li> <li>Liberation of the Republic, May 8th</li> <li>SS. Cyril and Methodius, July 5th</li> <li>Slovak National Uprising, August 29th</li> <li>Constitution of the Slovak Republic, September 1st</li> <li>Our Lady of the Seven Sorrows, September 15th</li> <li>All Saints Day, November 1st</li> <li>Freedom and Democracy of the Slovak Republic, November 17th</li> <li>Christmas Eve, December 24th</li> <li>Christmas, December 25th</li> <li>St. Stephen, December 26th</li> </ul>  \ingroup calendars
              let Slovakia = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ISlovakia_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Good Friday</li> <li>Family Day, Easter Monday</li> <li>Human Rights Day, March 21st (possibly moved to Monday)</li> <li>Freedom Day, April 27th (possibly moved to Monday)</li> <li>Workers Day, May 1st (possibly moved to Monday)</li> <li>Youth Day, June 16th (possibly moved to Monday)</li> <li>National Women's Day, August 9th (possibly moved to Monday)</li> <li>Heritage Day, September 24th (possibly moved to Monday)</li> <li>Day of Reconciliation, December 16th (possibly moved to Monday)</li> <li>Christmas, December 25th </li> <li>Day of Goodwill, December 26th (possibly moved to Monday)</li> <li>Election Day, April 22nd 2009</li> </ul>  \ingroup calendars
              let SouthAfrica = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ISouthAfrica_Factory > ()
              /// ! Public holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Independence Day, March 1st</li> <li>Arbour Day, April 5th (until 2005)</li> <li>Labour Day, May 1st</li> <li>Children's Day, May 5th</li> <li>Memorial Day, June 6th</li> <li>Constitution Day, July 17th (until 2007)</li> <li>Liberation Day, August 15th</li> <li>National Fondation Day, October 3th</li> <li>Christmas Day, December 25th</li> </ul>  Other holidays for which no rule is given (data available for 2004-2012 only:) <ul> <li>Lunar New Year, the last day of the previous lunar year, January 1st, 2nd in lunar calendar</li> <li>Election Days</li> <li>National Assemblies</li> <li>Presidency</li> <li>Regional Election Days</li> <li>Buddha's birthday, April 8th in lunar calendar</li> <li>Harvest Moon Day, August 14th, 15th, 16th in lunar calendar</li> </ul>  Holidays for the Korea exchange (data from <http://eng.krx.co.kr/m8/m8_6/m8_6_1/JHPENG08006_01.jsp> or <http://www.dooriworld.com/daishin/holiday/holiday.html>): <ul> <li>Public holidays as listed above</li> <li>Year-end closing</li> </ul>  \ingroup calendars
              let SouthKorea = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ISouthKorea_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Epiphany, January 6th</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Ascension</li> <li>Whit(Pentecost) Monday </li> <li>May Day, May 1st</li> <li>National Day, June 6th</li> <li>Midsummer Eve (Friday between June 19-25)</li> <li>Christmas Eve, December 24th</li> <li>Christmas Day, December 25th</li> <li>Boxing Day, December 26th</li> <li>New Year's Eve, December 31th</li> </ul>  \ingroup calendars
              let Sweden = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ISweden_Factory > ()
              /// ! Holidays: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Berchtoldstag, January 2nd</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Ascension Day</li> <li>Whit Monday</li> <li>Labour Day, May 1st</li> <li>National Day, August 1st</li> <li>Christmas, December 25th</li> <li>St. Stephen's Day, December 26th</li> </ul>  \ingroup calendars
              let Switzerland = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ISwitzerland_Factory > ()
              /// ! Holidays for the Taiwan stock exchange (data from <http://www.tse.com.tw/en/trading/trading_days.php>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Peace Memorial Day, February 28</li> <li>Labor Day, May 1st</li> <li>Double Tenth National Day, October 10th</li> </ul>  Other holidays for which no rule is given (data available for 2002-2011 only:) <ul> <li>Chinese Lunar New Year</li> <li>Tomb Sweeping Day</li> <li>Dragon Boat Festival</li> <li>Moon Festival</li> </ul>  \ingroup calendars
              let Taiwan = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ITaiwan_Factory > ()
              /// ! Holidays (see http://www.ecb.int): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Good Friday (since 2000)</li> <li>Easter Monday (since 2000)</li> <li>Labour Day, May 1st (since 2000)</li> <li>Christmas, December 25th</li> <li>Day of Goodwill, December 26th (since 2000)</li> <li>December 31st (1998, 1999, and 2001)</li> </ul>  \ingroup calendars  \test the correctness of the returned results is tested against a list of known holidays.
              let TARGET = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ITARGET_Factory > ()
              /// ! Holidays for the Istanbul Stock Exchange: (data from <http://www.ise.org/Markets/OfficialHolidays.aspx?sflang=en>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>National Sovereignty and Children???s Day, April 23rd</li> <li>Youth and Sports Day, May 19th</li> <li>Victory Day, August 30th</li> <li>Republic Day, October 29th</li> <li>Local Holidays (Kurban, Ramadan; 2004 to 2010 only) </li> </ul>  \ingroup calendars
              let Turkey = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.ITurkey_Factory > ()
              /// ! Holidays for the Ukrainian stock exchange (data from <http://www.ukrse.kiev.ua/eng/>): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st</li> <li>Orthodox Christmas, January 7th</li> <li>International Women's Day, March 8th</li> <li>Easter Monday</li> <li>Holy Trinity Day, 50 days after Easter</li> <li>International Workers' Solidarity Days, May 1st and 2nd</li> <li>Victory Day, May 9th</li> <li>Constitution Day, June 28th</li> <li>Independence Day, August 24th</li> </ul> Holidays falling on a Saturday or Sunday are moved to the following Monday.  \ingroup calendars
              let Ukraine = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IUkraine_Factory > ()
              /// ! Public holidays (data from http://www.dti.gov.uk/er/bankhol.htm): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Early May Bank Holiday, first Monday of May</li> <li>Spring Bank Holiday, last Monday of May</li> <li>Summer Bank Holiday, last Monday of August</li> <li>Christmas Day, December 25th (possibly moved to Monday or Tuesday)</li> <li>Boxing Day, December 26th (possibly moved to Monday or Tuesday)</li> </ul>  Holidays for the stock exchange: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Early May Bank Holiday, first Monday of May</li> <li>Spring Bank Holiday, last Monday of May</li> <li>Summer Bank Holiday, last Monday of August</li> <li>Christmas Day, December 25th (possibly moved to Monday or Tuesday)</li> <li>Boxing Day, December 26th (possibly moved to Monday or Tuesday)</li> </ul>  Holidays for the metals exchange: <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday)</li> <li>Good Friday</li> <li>Easter Monday</li> <li>Early May Bank Holiday, first Monday of May</li> <li>Spring Bank Holiday, last Monday of May</li> <li>Summer Bank Holiday, last Monday of August</li> <li>Christmas Day, December 25th (possibly moved to Monday or Tuesday)</li> <li>Boxing Day, December 26th (possibly moved to Monday or Tuesday)</li> </ul>  \ingroup calendars  \todo add LIFFE  \test the correctness of the returned results is tested against a list of known holidays.
              let UnitedKingdom = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IUnitedKingdom_Factory > ()
              /// ! Public holidays (see: http://www.opm.gov/fedhol/): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday if actually on Sunday, or to Friday if on Saturday)</li> <li>Martin Luther King's birthday, third Monday in January</li> <li>Presidents' Day (a.k.a. Washington's birthday), third Monday in February</li> <li>Memorial Day, last Monday in May</li> <li>Independence Day, July 4th (moved to Monday if Sunday or Friday if Saturday)</li> <li>Labor Day, first Monday in September</li> <li>Columbus Day, second Monday in October</li> <li>Veterans' Day, November 11th (moved to Monday if Sunday or Friday if Saturday)</li> <li>Thanksgiving Day, fourth Thursday in November</li> <li>Christmas, December 25th (moved to Monday if Sunday or Friday if Saturday)</li> </ul>  Holidays for the stock exchange (data from http://www.nyse.com): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday if actually on Sunday)</li> <li>Martin Luther King's birthday, third Monday in January (since 1998)</li> <li>Presidents' Day (a.k.a. Washington's birthday), third Monday in February</li> <li>Good Friday</li> <li>Memorial Day, last Monday in May</li> <li>Independence Day, July 4th (moved to Monday if Sunday or Friday if Saturday)</li> <li>Labor Day, first Monday in September</li> <li>Thanksgiving Day, fourth Thursday in November</li> <li>Presidential election day, first Tuesday in November of election years (until 1980)</li> <li>Christmas, December 25th (moved to Monday if Sunday or Friday if Saturday)</li> <li>Special historic closings (see http://www.nyse.com/pdfs/closings.pdf)</li> </ul>  Holidays for the government bond market (data from http://www.bondmarkets.com): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday if actually on Sunday)</li> <li>Martin Luther King's birthday, third Monday in January</li> <li>Presidents' Day (a.k.a. Washington's birthday), third Monday in February</li> <li>Good Friday</li> <li>Memorial Day, last Monday in May</li> <li>Independence Day, July 4th (moved to Monday if Sunday or Friday if Saturday)</li> <li>Labor Day, first Monday in September</li> <li>Columbus Day, second Monday in October</li> <li>Veterans' Day, November 11th (moved to Monday if Sunday or Friday if Saturday)</li> <li>Thanksgiving Day, fourth Thursday in November</li> <li>Christmas, December 25th (moved to Monday if Sunday or Friday if Saturday)</li> </ul>  Holidays for the North American Energy Reliability Council (data from http://www.nerc.com/~oc/offpeaks.html): <ul> <li>Saturdays</li> <li>Sundays</li> <li>New Year's Day, January 1st (possibly moved to Monday if actually on Sunday)</li> <li>Memorial Day, last Monday in May</li> <li>Independence Day, July 4th (moved to Monday if Sunday)</li> <li>Labor Day, first Monday in September</li> <li>Thanksgiving Day, fourth Thursday in November</li> <li>Christmas, December 25th (moved to Monday if Sunday)</li> </ul>  \ingroup calendars  \test the correctness of the returned results is tested against a list of known holidays.
              let UnitedStates = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IUnitedStates_Factory > ()
              /// ! This calendar has no bank holidays except for weekends (Saturdays and Sundays) as required by ISDA for calculating conventional CDS spreads.  \ingroup calendars
              let WeekendsOnly = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Calendars.IWeekendsOnly_Factory > ()
            end

          module Daycounters =
            begin
              /// ! Actual/360 day count convention, also known as "Act/360", or "A/360".  \ingroup daycounters
              let Actual360 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Daycounters.IActual360_Factory > ()
              /// ! "Actual/365 (Fixed)" day count convention, also know as "Act/365 (Fixed)", "A/365 (Fixed)", or "A/365F".  \warning According to ISDA, "Actual/365" (without "Fixed") is an alias for "Actual/Actual (ISDA)" (see ActualActual.)  If Actual/365 is not explicitly specified as fixed in an instrument specification, you might want to double-check its meaning.  \ingroup daycounters
              let Actual365Fixed = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Daycounters.IActual365Fixed_Factory > ()
              /// ! The day count can be calculated according to:  - the ISDA convention, also known as "Actual/Actual (Historical)", "Actual/Actual", "Act/Act", and according to ISDA also "Actual/365", "Act/365", and "A/365"; - the ISMA and US Treasury convention, also known as "Actual/Actual (Bond)"; - the AFB convention, also known as "Actual/Actual (Euro)".  For more details, refer to http://www.isda.org/publications/pdf/Day-Count-Fracation1999.pdf  \ingroup daycounters  \test the correctness of the results is checked against known good values.
              let ActualActual = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Daycounters.IActualActual_Factory > ()
              /// ! \ingroup daycounters
              let Business252 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Daycounters.IBusiness252_Factory > ()
              /// ! \ingroup daycounters
              let OneDayCounter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Daycounters.IOneDayCounter_Factory > ()
              /// ! This day counter tries to ensure that whole-month distances are returned as a simple fraction, i.e., 1 year = 1.0, 6 months = 0.5, 3 months = 0.25 and so forth.  \warning this day counter should be used together with NullCalendar, which ensures that dates at whole-month distances share the same day of month. It is <b>not</b> guaranteed to work with any other calendar.  \ingroup daycounters  \test the correctness of the results is checked against known good values.
              let SimpleDayCounter = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Daycounters.ISimpleDayCounter_Factory > ()
              /// ! The 30/360 day count can be calculated according to US, European, or Italian conventions.  US (NASD) convention: if the starting date is the 31st of a month, it becomes equal to the 30th of the same month. If the ending date is the 31st of a month and the starting date is earlier than the 30th of a month, the ending date becomes equal to the 1st of the next month, otherwise the ending date becomes equal to the 30th of the same month. Also known as "30/360", "360/360", or "Bond Basis"  European convention: starting dates or ending dates that occur on the 31st of a month become equal to the 30th of the same month. Also known as "30E/360", or "Eurobond Basis"  Italian convention: starting dates or ending dates that occur on February and are grater than 27 become equal to 30 for computational sake.  \ingroup daycounters
              let Thirty360 = Cephei.Core.FactoryFinder.Find<Cephei.QL.Times.Daycounters.IThirty360_Factory > ()
            end
        end

      module Utilities =
        begin
        end
    end
